我写了这个简单的代码:按位运算符。输出很奇怪。
如果我将按位操作(掩码)从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
....
....
答案 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
输出似乎对我有意义。您需要了解屏蔽操作的结果可能是一个相对较大的数字,因为它只是隔离了被测试的位,但该位仍在其所测试的整数值的内部二进制表示中的原始位置。