为啥 std::bitset 的位顺序相反? [复制]

Posted

技术标签:

【中文标题】为啥 std::bitset 的位顺序相反? [复制]【英文标题】:Why are the bits of a std::bitset in reverse order? [duplicate]为什么 std::bitset 的位顺序相反? [复制] 【发布时间】:2011-06-25 21:24:57 【问题描述】:

为什么bitset以相反的顺序存储位?经过多次挣扎,我终于写出了这个binary_to_dec。可以简化吗?

int binary_to_dec(std::string bin)

    std::bitset<8> bit;

    int c = bin.size();

    for (size_t i = 0; i < bin.size(); i++,c--)
    
        bit.set(c-1, (bin[i]-'0' ? true : false));
    

    return bit.to_ulong();

【问题讨论】:

例如:std::string bin = "1011" 但 bitset 要求它是有序的 "1101" bitset 不以“反向”顺序存储位。但是,您的输入字符串确实如此。 bitset 不“需要”任何东西!它基本上只是一个数组,to_ulong() 只是计算 bit[0]*2^0 + bit[1]*2^1 + bit[2]*2^2 + ..." (where ^` 表示“to-the-power-of”)。 相关:Why does bitset expose bits in little-endian fashion? 【参考方案1】:

Bitset 以您认为“反向”的顺序存储其数字,因为我们以 递减 的重要性顺序写入数字的数字,即使字符串的字符以 排列增加索引顺序。

如果我们以 little-endian 顺序编写我们的数字,那么您就不会有这种混淆,因为字符串索引 0 处的字符将代表 bitset 的第 0 位。但是我们以大端顺序编写我们的数字。恐怕我不知道导致该公约的人类历史细节。 (请注意,任何特定 CPU 用于存储多字节数字的字节序是无关紧要的。我说的是我们在显示数字以供人类阅读时使用的字节序。)

例如,如果我们把十进制数 12 写成二进制,我们得到 1100。最低有效位在右边。我们称之为“位 0”。但是如果我们把它放在一个字符串 "1100" 中,那么该字符串的索引 0 处的 字符 表示位 3,而不是位 0。如果我们创建一个位集,其位的顺序与字符,to_ulong 将返回 3 而不是 12。

bitset 类有一个构造函数,它接受std::string,但它期望字符的索引与位的索引匹配,因此需要反转字符串。试试这个:

int binary_to_dec(std::string const& bin)

  std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
  return bit.to_ulong();

【讨论】:

【参考方案2】:
unsigned long binary_to_dec(std::string bin)

    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();

编辑:格式化和返回类型。

【讨论】:

以上是关于为啥 std::bitset 的位顺序相反? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::bitset<8> 变量无法处理 11111111?

std::bitset 的二进制序列化

迭代std :: bitset中真实位的有效方法?

为啥带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

如何将 C++ 位集中的位范围子集转换为数字? [复制]

如何打印大于“unsigned long long”的“std::bitset”的十进制值?