我试图读取二进制字符串中的一个位但似乎无法让它正常工作。我读入一个值然后转换为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
如果我正在寻找i
为0的bit3,那么该位将等于1.任何想法?
答案 0 :(得分:1)
n = 223
bitpos = 3
bit3 = (n >> (bitpos-1))&1
你应该怎么做...不要使用字符串!
答案 1 :(得分:0)
你可以使用切片来获得正确的数字。
bits = getBin(slot, 32)
bit = bits[bit_location-1:bit_location] #Assumes zero based values
print("bit: %i\n"%(bit))
答案 2 :(得分:0)
要测试整数值中的特定位,请使用&
按位操作数;无需将其转换为二进制字符串。
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个字符的二进制字符串。