尽管公认的答案指出,持久性是从内存角度来看的一个概念。但是我不认为直接回答这个问题。
一些答案告诉我,按位运算不依赖于字节序,处理器可以用任何其他方式表示字节。无论如何,这是在谈论那些偏执狂。
但是,例如当我们在纸上进行按位计算时,是否不需要首先说明字节序?大多数情况下,我们会隐式选择一个字节序。
例如,假设我们有一行这样的代码
0x1F & 0xEF
您将如何在纸上手工计算结果?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
因此,这里我们使用Big Endian格式进行计算。您还可以使用Little Endian计算并获得相同的结果。
顺便说一句,当我们用代码写数字时,我认为它就像是Big Endian格式。123456要么0x1F,最重要的数字从左开始。
同样,一旦我们在纸上编写了某种二进制格式的值,我认为我们已经选择了Endianess,并且正在从内存中查看该值。
回到问题所在,<<应该将移位操作视为从LSB(最低有效字节)转换为MSB(最高有效字节)。
然后以问题中的示例为例:
numb=1025
小端
LSB 00000001 00000100 00000000 00000000 MSB
所以<< 10将10bit转向从LSB到MSB。
<< 10Little Endian格式的比较和操作逐步:
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 LSBBig Endian格式编写它的。
所以就像
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
总结一下:
虽然据说按位运算是抽象的……但是,当我们手动计算按位运算时,在纸上写下二进制格式时,我们仍然需要知道我们正在使用什么字节序。另外,我们需要确保所有操作员都使用相同的字节序。
OP之所以未能获得预期的结果,是因为他做错了比赛。