尽管接受的答案指出字节序是内存视图中的一个概念。但我认为这不能直接回答问题。
一些答案告诉我,位运算不依赖于字节序,处理器可能以任何其他方式表示字节。无论如何,它是在谈论字节序被抽象化。
但是,例如,当我们在纸上进行一些按位计算时,不需要首先说明字节序吗?大多数时候,我们会隐式选择字节序。
例如,假设我们有这样一行代码
0x1F & 0xEF
你会如何在纸上手工计算结果?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
所以这里我们使用 Big Endian 格式来进行计算。也可以使用 Little Endian 计算,得到同样的结果。
顺便说一句,当我们在代码中编写数字时,我认为它就像是大端格式。 123456 或 0x1F,最重要的数字从左边开始。
再次,一旦我们在纸上写了一些二进制格式的值,我认为我们已经选择了 Endianess,并且我们正在查看我们从内存中看到的值。
回到这个问题,移位操作<< 应该被认为是从 LSB(最低有效字节)转移到 MSB(最高有效字节)。
那么问题中的例子:
numb=1025
小端序
LSB 00000001 00000100 00000000 00000000 MSB
所以 << 10 将是 10bit 从 LSB 转移到 MSB。
Little Endian 格式的比较和<< 10 操作一步一步:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
哇!我得到了 OP 描述的预期结果!
OP没有得到预期结果的问题是:
他好像没有从 LSB 转到 MSB。
当以 Little Endian 格式移位时,您应该意识到(感谢上帝,我意识到了):
LSB 10000000 00000000 MSB << 1 是
LSB 00000000 00000001 MSB,不是
LSB 01000000 00000000 MSB
因为对于每个个体8bits,我们实际上是以MSB 00000000 LSB Big Endian 格式编写的。
原来如此
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
总结一下:
虽然据说按位运算是抽象出来的 blablablabla...,但当我们手动计算按位运算时,我们仍然需要知道我们使用的是什么字节序,因为我们在纸上写下二进制格式。此外,我们需要确保所有运算符使用相同的字节序。
OP 没有得到预期的结果是因为他换错了。