std :: bitset是否可以便携?

时间:2011-10-25 13:24:57

标签: c++ portability bitset

C ++是否会对位排序做出任何说明?我特别致力于协议数据包布局,我怀疑是否有一种可移植的方式来指定将某个数字写入第5,6,7位,其中第5位是“最重要的”。

我的问题:

  • 是0x01总是表示为第7位设置的字节?
  • bitset<8>().set(7).to_ulong()总是等于1?

3 个答案:

答案 0 :(得分:11)

从20.5 / 3(ISO / IEC 14882:2011)

  

在对象之间进行转换时   在类比特组和一些整数类型的值中,比特位置pos对应于比特值1&lt;&lt;&lt;正。

也就是说,bitset<8>().set(7).to_ulong()保证为(1 << 7) == 128

答案 1 :(得分:2)

bitset不进行序列化,所以你不需要(需要)知道。使用序列化/反序列化。

  

是bitset&lt; 8&gt;()。set(7).to_ulong()总是等于1

不,不在我的机器上(见下文)。

但是,我当然希望iostream运算符能够移植:

#include <bitset>
#include <sstream>
#include <iostream>

int main()
{
    std::bitset<8> bits;
    std::cout << bits.set(7).to_ulong() << std::endl;

    std::stringstream ss;
    ss << bits;

    std::cout << ss.rdbuf() << std::endl;

    std::bitset<8> cloned;
    ss >> cloned;
    std::cout << cloned.set(7).to_ulong() << std::endl;
    std::cout << cloned << std::endl;
}

打印

128
10000000
128
10000000

答案 2 :(得分:2)

如果问题是在通过网络发送二进制对象时是否可以愉快地忽略平台的字节顺序,答案是你不能。如果问题是在两个不同平台上编译的相同代码是否会产生相同的结果,那么答案是肯定的。