为什么 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;

}

编辑这里是我的结果的快照

同一程序读取另一组输入的另一个快照,但这次它给出了正确的输出。顺便说一下,11011001 是输入,接下来的两个石灰是输出

当您输入例如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'));

从您的用例来看,将 bin1bin2 的类型更改为 std::string 可能会奏效。

我不知道您期望什么,但代码本身表达得很清楚。我只提取了讨论所需的最低限度:

int bin1=0;
cin>>bin1;

bin1int。您从 cin 读取了一个 int,而 int1010。即 一千零 。这里不涉及位。

在二进制中,1010(一千零十)看起来像这样:00000011 11110010

x1=bitset<4>(bin1).to_ulong();

当使用 bin1 的值构造 bitset<4> 时,仅使用 bin14 最右边 (least-significant) 位。这些位是 0010,它们代表数字 2x1 的值为 2.

同理,从cin读出bin2的值为1110一千、一百一十) ,它的二进制表示是00000100 01010110,它最右边的4位是0110,它们是整数6.

的二进制表示

代码做了它应该做的;你的期望不正确。

了解 bitset::bitset()。它包含的示例可以帮助您理解差异。