1

我正在尝试读取二进制字符串中的单个位,但似乎无法使其正常工作。我读入一个值,然后转换为 32b 字符串。从那里我需要读取字符串中的特定位,但它并不总是相同的。getBin 函数返回前导 0 的 32 位字符串。我的代码总是返回 1,即使该位是 0。代码示例:

slot=195035377
getBin = lambda x, n: x >= 0 and str(bin(x))[2:].zfill(n) or "-" + str(bin(x))[3:].zfill(n)
bits = getBin(slot,32)
bit = (bits and (1 * (2 ** y)) != 0)
print("bit: %i\n"%(bit))

在这个例子中bits = 00001011101000000000000011110011

如果我正在寻找isa 0 的 bit3,则 bit 将等于 1。有什么想法吗?

4

3 回答 3

1
n = 223
bitpos = 3
bit3 = (n >> (bitpos-1))&1

是你应该怎么做......不要使用字符串!

于 2013-06-17T16:10:45.453 回答
1

要测试整数值中的特定位,请使用&按位操作数;无需将其转换为二进制字符串。

if slot & (1 << 3):
    print 'bit 3 is set'
else:
    print 'bit 3 is not set'

上面的代码将一个测试位向左移动了两次。或者,slot向右移动 3 次:

if (slot >> 2) & 1:

要使任何位位置都通用,请减去 1:

if slot & (1 << (bitpos - 1)):
    print 'bit {} is set'.format(bitpos)

或者

if (slot >> (bitpos - 1)) & 1:

您的二进制格式代码过于冗长。只需使用该format()函数创建二进制字符串表示:

format(slot, '032b')

将二进制值格式化为 0 填充的 32 个字符的二进制字符串。

于 2013-06-17T16:11:42.770 回答
0

您可以使用切片来获得正确的数字。

bits = getBin(slot, 32)
bit = bits[bit_location-1:bit_location] #Assumes zero based values

print("bit: %i\n"%(bit))
于 2013-06-17T16:09:31.810 回答