在Python中逐位比较2个数字(16位)最有效的方法是什么?

2024-09-30 16:41:41 发布

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

我想知道在python中逐位比较2个数字(16位)最有效的方法是什么?比较的顺序并不重要

在伪代码中,我需要如下内容:

IF NUMBER1_BIT1 !=  NUMBER2_BIT1    THEN do something
IF NUMBER1_BIT2 !=  NUMBER2_BIT2    THEN do something 
IF NUMBER1_BIT3 !=  NUMBER2_BIT3    THEN do something 
…..
IF NUMBER1_BIT16 !=  NUMBER2_BIT16 THEN do something 

我的程序的这一部分将被大量执行,因此我希望尽可能提高python的效率


Tags: 方法代码if顺序数字dosomethingthen
3条回答

听起来像是在创建一个位掩码。这在C语言中是很常见的,它使用32位数字,每一位都由一个常量表示

这种方法最酷的一点是,如果在输入中设置了位,掩码将只产生一些输出,否则输出将为0

无论如何,这不是C;这是python,因此我们可以使用^{}方法将每个数字转换为二进制字符串,然后比较字符串中的每个字符

b_num1 = bin(num1).replace('0b', '')
b_num2 = bin(num2).replace('0b', '')

for i in range(num1.bit_length()):
    if b_num1[i] != b_num2[i]:
        pass # do something
    ...

编辑

在python3中,我们可以使用^{}创建二进制数:

b_num1 = f'{num1:b}'
b_num2 = f'{num2:b}'

您可以使用助手函数将其转换为switch语句:

def bitSwitch(v): yield lambda b: v & (1<<b)

您可以这样使用:

for case in bitSwitch(number1 ^ number2):
    if case(0): 
       # do something ...

    if case(1):
       # do something else ...

    if case(2):
       # do some other thing ...

    if case(3):
       # do something different ...

    ...

    if case(15):
       # do that last thing ...

为了提高效率,您可以在switch函数中用v & b替换v & (1<<b),并在case(..)调用中使用2的预计算幂:case(1):{}{}{}。。。在这一点上,napuzba的解决方案会更好,因为它以更少的函数调用开销完成同样的事情

您可以使用xorand运算符:

num3 = num1 ^ num2
if num3 & 1: # bits 0 are different
    ...
if num3 & 2: # bits 1 are different
    ...
if num3 & 4: # bits 2 are different
    ...

相关问题 更多 >