当我使用std::bitset<N>::bitset(unsigned long long)
时,这会构造一个bitset对象,如果我通过operator[]
访问它,位似乎以小端模式排序。例如:
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
<<E2
的值是将E1
向左移动E2
位;空出的位将填充零。
在这里,必须将E1
中的位解释为从MSB→LSB,并将其向左移动E2
次。如果按照LSB→MSB编写,那么只有向右移动E2
次才能得到相同的结果。
我很惊讶在C++的其他地方,该语言似乎呈现了自然的(英语;从左到右)书写顺序(在进行位运算(如移位等)时)。为什么这里要与众不同呢?