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

2024-04-19 11:04:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了这个简单的代码:按位运算符。输出非常奇怪。 如果我将按位操作(mask)从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
 ....
 ....

Tags: 代码inforbinrange运算符maskreg
1条回答
网友
1楼 · 发布于 2024-04-19 11:04:25

这里是您的代码的重写版本,修改后以更可读的方式打印结果(注意,bit_length()的使用需要python2.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

输出对我来说似乎有意义。您需要了解掩蔽运算的结果可能是一个相对较大的数字,因为它只是隔离了被测试的位,但位仍然在被测试整数值的内部二进制表示中的原始位置。你知道吗

相关问题 更多 >