不明白为什么这些按位操作不起作用

时间:2017-11-30 23:26:47

标签: python bitwise-operators zero

我写了这个简单的代码:按位运算符。输出很奇怪。 如果我将按位操作(掩码)从1<<i更改为1>>i 始终为0.请参阅输出。

reg=31272
#binreg=111101000101000
print bin(reg)
for i in range(0,15):
    mask=1<<i
    c=reg & mask
    print "i:", i ,"c:", c ,"-", bin(c)

输出:

bitwise_little_endian():
 0b111101000101000
 i: 0 c: 0 - 0b0
 i: 1 c: 0 - 0b0
 i: 2 c: 0 - 0b0
 i: 3 c: 8 - 0b1000
 i: 4 c: 0 - 0b0
 i: 5 c: 32 - 0b100000
 i: 6 c: 0 - 0b0
 i: 7 c: 0 - 0b0
 i: 8 c: 0 - 0b0
 i: 9 c: 512 - 0b1000000000
 i: 10 c: 0 - 0b0
 i: 11 c: 2048 - 0b100000000000
 i: 12 c: 4096 - 0b1000000000000
 i: 13 c: 8192 - 0b10000000000000
 i: 14 c: 16384 - 0b100000000000000


bitwise_big_endian():
0b111101000101000
i: 0 c: 0 - 0b0
i: 1 c: 0 - 0b0
i: 2 c: 0 - 0b0
 ....
 ....

1 个答案:

答案 0 :(得分:1)

这是您的代码的重写版本,经过修改后以更易读的方式打印结果(请注意,使用bit_length()需要Python 2.7 +)。

reg = 31272  # 0b111101000101000
num_bits = reg.bit_length()
print('reg:  0b{:0{width}b}'.format(reg, width=num_bits))

for i in range(num_bits):  # Test each bit in "reg".
    mask = 1 << i
    c = reg & mask
    print('i: {:>2}, c: {:6,} - 0b{:0{width}b}'.format(i, c, c, width=num_bits))

输出:

reg:  0b111101000101000
i:  0, c:      0 - 0b000000000000000
i:  1, c:      0 - 0b000000000000000
i:  2, c:      0 - 0b000000000000000
i:  3, c:      8 - 0b000000000001000
i:  4, c:      0 - 0b000000000000000
i:  5, c:     32 - 0b000000000100000
i:  6, c:      0 - 0b000000000000000
i:  7, c:      0 - 0b000000000000000
i:  8, c:      0 - 0b000000000000000
i:  9, c:    512 - 0b000001000000000
i: 10, c:      0 - 0b000000000000000
i: 11, c:  2,048 - 0b000100000000000
i: 12, c:  4,096 - 0b001000000000000
i: 13, c:  8,192 - 0b010000000000000
i: 14, c: 16,384 - 0b100000000000000

输出似乎对我有意义。您需要了解屏蔽操作的结果可能是一个相对较大的数字,因为它只是隔离了被测试的位,但该位仍在其所测试的整数值的内部二进制表示中的原始位置。