为什么std :: bitset以little-endian方式暴露位?

时间:2015-04-07 03:16:15

标签: c++ binary endianness bitset

当我使用std::bitset<N>::bitset( unsigned long long )时,这构造了一个bitset,当我通过operator[]访问它时,这些位似乎是以little-endian方式排序的。例如:

std::bitset<4> b(3ULL);
std::cout << b[0] << b[1] << b[2] << b[3];

打印1100而不是0011,即结尾(或LSB)位于小(低)地址,索引0。

查看标准,它说

  

将前M位位置初始化为val

中的相应位值

程序员自然会想到从LSB到MSB的二进制数字(从右到左)。所以前M位的位置可以理解为LSB→MSB,所以位0位于b[0]

然而,在转移时,定义为

  

E1&lt;&lt; E2E1左移E2位位置;空位是零填充。

这里必须将E1中的位解释为从MSB→LSB开始,然后是左移E2次。如果它是从LSB→MSB写的,那么只有右移E2次才能得到相同的结果。

我很惊讶C ++中的其他地方,这种语言似乎投射出自然(英语;从左到右)的写作顺序(当进行像移位这样的按位操作时)。为什么在这里有所不同?

2 个答案:

答案 0 :(得分:14)

就标准而言,没有关于endian-ness的概念。关于std::bitset[template.bitset]/3定义位位置

  

在类bitset<N>的对象与值之间进行转换时   某些整数类型,位位置 pos对应于位值1<<pos。   对应于两位或更多位的积分值是和   他们的比特值。

在标准报价中使用位位置的定义

  

将第一个M 位位置初始化为val

中的相应位值

带有二进制表示val的{​​{1}}会导致11 bitset<N> bb[0] = 1,其余位设置为b[1] = 1

答案 1 :(得分:8)

这与位通常编号的方式一致 - 位0表示2 0 ,位1表示2 1 等。它与字节序无关该体系结构涉及字节排序而不是位排序。