Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python检查序列中的位是真还是假_Python_Bits - Fatal编程技术网

python检查序列中的位是真还是假

python检查序列中的位是真还是假,python,bits,Python,Bits,我想知道序列中的一位是1还是0(真还是假) 如果我有11010011的某些位序列,我如何检查第4个位置是否正确 例如: 10010101 (4th bit) -> False 10010101 (3rd bit) -> True 位=0b11010011 如果位&(1可以使用位移位 >>> 0b10010101 >> 4 & 1 1 >>> 0b10010101 >> 3 & 1 0 在没有位移位的情况下

我想知道序列中的一位是1还是0(真还是假) 如果我有11010011的某些位序列,我如何检查第4个位置是否正确

例如:

10010101 (4th bit) -> False
10010101 (3rd bit) -> True
位=0b11010011

如果位&(1可以使用位移位

>>> 0b10010101 >> 4 & 1
1
>>> 0b10010101 >> 3 & 1
0

在没有位移位的情况下:

if bits & 0b1000:
    ...
编辑:实际上,
(1>>dis.dis(lambda x:x&(1>>dis.dis)(lambda x:x&0b1000)
1 0快速加载0(x)
3负载常数1(8)
6二元和
7返回值

这两种解决方案是等效的,请选择在您的上下文中看起来更可读的解决方案。

按位左移和按位and运算符是您的朋友。
bits = '1110111'

if bits[-4] == '0':
    print "......false"
else:
    print  "....true"
通常,您可以检查第n位是否设置/取消设置,如下所示:

if (x & (1<<n)) 
  ## n-th bit is set (1)

else 
  ## n-th bit is not set (0)

如果(x&(1假设为整数,如果正在计算左手(LH)、右手(RH)的最高有效位(MSB)租约有效位(LSB):

如果要向MSB计数LSB,请反转:

def check_bitR2L(byte, bit):
    return bool(byte & (0b1<<bit))
印刷品:

 bit   LSB   MSB 
  0     1     1  
  1     0     0  
  2     1     0  
  3     0     1  
  4     1     0  
  5     0     1  
  6     0     0  
  7     1     1  

非常感谢。我查看了位比较,但描述没有多大帮助。不确定为什么会被否决这是一个完全有效的方法,甚至可以比其他方法更快(在某些情况下)..如果位序列已经是一个字符串,这是最好的方法。您是从左计数还是从右计数?显示这两者的timeit结果更合适…反汇编可能会产生误导sometimes@JoranBeasley:不在这种情况下。除了
co_consts
,字节码是相同的。而且,时间对于这样快的字节码并不理想-应极其小心地使用和(您可能会测量timeit使用的
循环的
开销)。
x&(1@JoranBeasley:我的测试不一致。顺便说一句,这是您应该运行的代码:
timeit('x&0b1000\n'*1000,'x=5')
。(请注意
*1000
——如果您没有这样做,那么您已经测量了
itertools.repeat()
)@Cyber:)-oops..同时使用多种语言的问题..编辑..没问题,我一直在做相同的事情!为了清晰起见,请不要忘记括号。:)
def check_bitL2R(byte, bit):
    return bool(byte & (0b10000000>>bit))
def check_bitR2L(byte, bit):
    return bool(byte & (0b1<<bit))
fmt='{:^5} {:^5} {:^5}'
print fmt.format(*'bit  LSB  MSB'.split())
for bit in range(8):
    print fmt.format(bit, check_bitR2L(0b10010101, bit), check_bitL2R(0b10010101, bit)) 
 bit   LSB   MSB 
  0     1     1  
  1     0     0  
  2     1     0  
  3     0     1  
  4     1     0  
  5     0     1  
  6     0     0  
  7     1     1