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

leg*_*s2k 8 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];
Run Code Online (Sandbox Code Playgroud)

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

它说,查找标准

将前M位位置初始化为相应的位值 val

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

然而,在转变中,定义是如此

E1<< 的值E2E1左移位E2位置; 空位是零填充的.

这里必须解释E1从MSB→LSB开始的位,然后是左移E2时间.如果它是从LSB→MSB写的,那么只有右移E2时间会产生相同的结果.

我很惊讶在C++的其他地方,语言似乎投射出自然(英语;从左到右)的写作顺序(当进行诸如移位之类的按位操作时).为什么在这里不一样?

Pra*_*han 15

就标准而言,没有关于字符串的概念.说到位std::bitset,[template.bitset]/3定义位位置:

当在类的对象bitset<N>和某个整数类型的值之间进行转换时,位位置 pos对应于位值1<<pos.对应于两位或更多位的积分值是它们的位值的总和.

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

将第一个M 比特位置初始化为相应的比特值val

一个val用二进制表示11导致bitset<N> bb[0] = 1,b[1] = 1和其余比特设置为0.


Mar*_*som 8

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