当我使用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;E2
是E1
左移E2
位位置;空位是零填充。
这里必须将E1
中的位解释为从MSB→LSB开始,然后是左移E2
次。如果它是从LSB→MSB写的,那么只有右移E2
次才能得到相同的结果。
我很惊讶C ++中的其他地方,这种语言似乎投射出自然(英语;从左到右)的写作顺序(当进行像移位这样的按位操作时)。为什么在这里有所不同?
答案 0 :(得分:14)
就标准而言,没有关于endian-ness的概念。关于std::bitset
,[template.bitset]/3
定义位位置:
在类
bitset<N>
的对象与值之间进行转换时 某些整数类型,位位置pos
对应于位值1<<pos
。 对应于两位或更多位的积分值是和 他们的比特值。
在标准报价中使用位位置的定义
将第一个
中的相应位值M
位位置初始化为val
带有二进制表示val
的{{1}}会导致11
bitset<N> b
,b[0] = 1
,其余位设置为b[1] = 1
。
答案 1 :(得分:8)
这与位通常编号的方式一致 - 位0表示2 0 ,位1表示2 1 等。它与字节序无关该体系结构涉及字节排序而不是位排序。