C++右位移(bit-shift right)出现意外结果,求技术解释
右移运算结果不符合预期的原因解析
你的问题核心是对移位运算的操作对象理解错误——移位是针对数值的二进制位进行操作,不是你误以为的十六进制数位。
先一步步拆解计算过程:
- 变量
p = 85,十进制85转二进制为0b01010101(32位int会在前面补24个0,不影响最终结果),转十六进制是0x55,这部分你是对的。 p >> 1是将二进制位整体右移1位:
原二进制:0b01010101→ 右移1位后得到:0b00101010
这个值转十进制是42,十六进制就是0x2a,和你看到的输出一致。p >> 2是将二进制位整体右移2位:
原二进制:0b01010101→ 右移2位后得到:0b00010101
这个值转十进制是21,十六进制就是0x15,也和输出匹配。
你之前预期的0x5和0x0,是错误地把十六进制数0x55当成两个独立的十六进制数位(5和5)来移位,这完全不符合C++中移位运算的规则。移位运算始终基于数值的二进制表示操作,和你用什么进制输出无关。
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

