为什么 bitset 函数没有为 1110 或 1011 等二进制字符串返回正确的十进制值?
Why is the bitset function not returning correct decimal value for binary strings like 1110 or 1011?
这是我的代码,它使用 1 和 0 的 4 个字符串并使用 bitset
函数转换为十进制。它为所有组合返回正确值,但涉及 11 和 10 的组合除外,如 {1110,1010,1011,1111}
。对于这些数字,它返回忽略 MSB 的结果。那是因为 1010
它给出 2 作为答案。
#include<bits/stdc++.h>
using namespace std;
#define ul unsigned long
int main(int argc, char const *argv[])
{
int bin1=0,bin2=0,choice=0;
ul x1=0,x2=0;
//string binary;
cin>>bin1;
x1=bitset<4>(bin1).to_ulong();
cin>>bin2;
x2=bitset<4>(bin2).to_ulong();
cout<<x1<<" "<<x2<<endl;
return 0;
}
编辑这里是我的结果的快照
同一程序读取另一组输入的另一个快照,但这次它给出了正确的输出。顺便说一下,1101
和 1001
是输入,接下来的两个石灰是输出
当您输入例如1010
那么就是十进制值1010
,二进制就是1111110010
.
这是您用来初始化位集的值。由于位集只包含四位,因此将使用最低的四位,即0010
。
简单的解决方案是将输入读取为 strings.
cout << bitset<4>(1010).to_ulong() << endl;
打印 2。
cout << bitset<4>(0b1010).to_ulong() << endl;
打印 10。(注意:binary literals 是在 C++14 中引入的)
来自cppreference documentation of std::bitset
:
bitset( unsigned long val );
Constructs a bitset, initializing the first (rightmost, least significant) M bit positions to the corresponding bit values of val, where M is the smaller of the number of bits in an unsigned long long and the number of bits N in the bitset being constructed. [...]
1010
的位表示不是 0b1010
,而是 0b1111110010
- 这对于位集来说太大了。这就是您看到意外结果的原因。
Bitset 将其输入更改为二进制表示,因此 0 和 1
二进制表示:
1010 -> 1111110010
1100 -> 10001001100
你只取了 32 位中的 4 位(int 通常有 4 个字节,4*8 = 32 位),所以
1010 -> 0010 -> 十进制 2
1100 -> 1100 -> 十进制 12
您需要位集构造函数的 string 重载。
template<class CharT, class Traits, class Alloc>
explicit bitset( const std::basic_string<CharT,Traits,Alloc>& str,
typename std::basic_string<CharT,Traits,Alloc>::size_type pos = 0,
typename std::basic_string<CharT,Traits,Alloc>::size_type n =
std::basic_string<CharT,Traits,Alloc>::npos,
CharT zero = CharT('0'),
CharT one = CharT('1'));
从您的用例来看,将 bin1
和 bin2
的类型更改为 std::string
可能会奏效。
我不知道您期望什么,但代码本身表达得很清楚。我只提取了讨论所需的最低限度:
int bin1=0;
cin>>bin1;
bin1
是 int
。您从 cin
读取了一个 int
,而 int
是 1010
。即 一千零 。这里不涉及位。
在二进制中,1010
(一千零十)看起来像这样:00000011 11110010
x1=bitset<4>(bin1).to_ulong();
当使用 bin1
的值构造 bitset<4>
时,仅使用 bin1
的 4
最右边 (least-significant) 位。这些位是 0010
,它们代表数字 2
。 x1
的值为 2
.
同理,从cin
读出bin2
的值为1110
(一千、一百一十) ,它的二进制表示是00000100 01010110
,它最右边的4
位是0110
,它们是整数6
.
的二进制表示
代码做了它应该做的;你的期望不正确。
了解 bitset::bitset()
。它包含的示例可以帮助您理解差异。
这是我的代码,它使用 1 和 0 的 4 个字符串并使用 bitset
函数转换为十进制。它为所有组合返回正确值,但涉及 11 和 10 的组合除外,如 {1110,1010,1011,1111}
。对于这些数字,它返回忽略 MSB 的结果。那是因为 1010
它给出 2 作为答案。
#include<bits/stdc++.h>
using namespace std;
#define ul unsigned long
int main(int argc, char const *argv[])
{
int bin1=0,bin2=0,choice=0;
ul x1=0,x2=0;
//string binary;
cin>>bin1;
x1=bitset<4>(bin1).to_ulong();
cin>>bin2;
x2=bitset<4>(bin2).to_ulong();
cout<<x1<<" "<<x2<<endl;
return 0;
}
编辑这里是我的结果的快照
同一程序读取另一组输入的另一个快照,但这次它给出了正确的输出。顺便说一下,1101
和 1001
是输入,接下来的两个石灰是输出
当您输入例如1010
那么就是十进制值1010
,二进制就是1111110010
.
这是您用来初始化位集的值。由于位集只包含四位,因此将使用最低的四位,即0010
。
简单的解决方案是将输入读取为 strings.
cout << bitset<4>(1010).to_ulong() << endl;
打印 2。
cout << bitset<4>(0b1010).to_ulong() << endl;
打印 10。(注意:binary literals 是在 C++14 中引入的)
来自cppreference documentation of std::bitset
:
bitset( unsigned long val );
Constructs a bitset, initializing the first (rightmost, least significant) M bit positions to the corresponding bit values of val, where M is the smaller of the number of bits in an unsigned long long and the number of bits N in the bitset being constructed. [...]
1010
的位表示不是 0b1010
,而是 0b1111110010
- 这对于位集来说太大了。这就是您看到意外结果的原因。
Bitset 将其输入更改为二进制表示,因此 0 和 1 二进制表示:
1010 -> 1111110010
1100 -> 10001001100
你只取了 32 位中的 4 位(int 通常有 4 个字节,4*8 = 32 位),所以
1010 -> 0010 -> 十进制 2
1100 -> 1100 -> 十进制 12
您需要位集构造函数的 string 重载。
template<class CharT, class Traits, class Alloc>
explicit bitset( const std::basic_string<CharT,Traits,Alloc>& str,
typename std::basic_string<CharT,Traits,Alloc>::size_type pos = 0,
typename std::basic_string<CharT,Traits,Alloc>::size_type n =
std::basic_string<CharT,Traits,Alloc>::npos,
CharT zero = CharT('0'),
CharT one = CharT('1'));
从您的用例来看,将 bin1
和 bin2
的类型更改为 std::string
可能会奏效。
我不知道您期望什么,但代码本身表达得很清楚。我只提取了讨论所需的最低限度:
int bin1=0;
cin>>bin1;
bin1
是 int
。您从 cin
读取了一个 int
,而 int
是 1010
。即 一千零 。这里不涉及位。
在二进制中,1010
(一千零十)看起来像这样:00000011 11110010
x1=bitset<4>(bin1).to_ulong();
当使用 bin1
的值构造 bitset<4>
时,仅使用 bin1
的 4
最右边 (least-significant) 位。这些位是 0010
,它们代表数字 2
。 x1
的值为 2
.
同理,从cin
读出bin2
的值为1110
(一千、一百一十) ,它的二进制表示是00000100 01010110
,它最右边的4
位是0110
,它们是整数6
.
代码做了它应该做的;你的期望不正确。
了解 bitset::bitset()
。它包含的示例可以帮助您理解差异。