位右移运算结果不符合预期问题求助
位右移运算结果不符合预期问题求助
看起来你遇到的问题是位右移后的结果和预期不符,我们一步步拆解你的代码,就能找到问题所在啦~
先梳理你的代码执行完整流程:
- 初始阶段,你定义了变量:
s = 154,p = 6 - 接着执行了位或操作
s = s | p,我们来算一下这个操作的具体结果:- 154的二进制是
10011010,6的二进制是00000110 - 位或运算的规则是对应位只要有一个1就设为1,所以运算后的二进制结果是
10011110,转换成十进制就是158
- 154的二进制是
- 之后你对这个已经被更新为158的
s执行右移2位操作:sbutshift2digit = s >> 2- 整数右移2位等价于对该数做整数除法除以4,158 ÷ 4 = 39.5,而Python的整数右移会直接舍弃小数部分,所以结果就是39,这和你代码输出的结果完全一致
那你预期的38是怎么来的呢?应该是你误以为右移操作是针对初始的s=154来计算的对吧?如果用初始值154执行右移2位:154 >> 2,154 ÷4=38.5,舍弃小数后确实是38,但你的代码里在右移之前已经把s的值改成了位或后的158,所以结果自然和预期产生了偏差。
如果你的需求是对初始的s值执行右移操作,只需要在修改s之前先保存初始值即可,比如调整代码如下:
# 初始定义变量 s = 154 p = 6 # 保存初始的s值 original_s = s # 执行位或操作更新s s = s | p # 对初始s执行右移2位操作 s_original_shift = original_s >> 2 p_shift = p >> 2 print("初始s右移2位的十进制值:", s_original_shift) # 输出38 print("初始s右移2位的二进制值:", bin(s_original_shift)[2:]) # 输出100110 print("\n") print("p右移2位的十进制值:", p_shift) # 输出1 print("p右移2位的二进制值:", bin(p_shift)[2:]) # 输出1
总结一下:问题的核心是你在执行右移操作前已经修改了s的取值,用的是位或运算后的158而非初始的154,这才导致结果和你的预期不符~
备注:内容来源于stack exchange,提问作者Prearea
相关产品推荐
相关产品推荐

