Python中&运算符正确应用:16位模式匹配异常排查
问题分析与解决
核心问题原因
你的代码逻辑本身没有错误,但对需求的实现方式和二进制位的对应关系理解有偏差:
- 二进制字符串转整数时,字符串左侧是整数的最高位,右侧是最低位。因此64位字符串的最后16个字符,对应整数的最低16位(20到215)。
- 你使用的掩码
0x3200(二进制0b0011001000000000)的作用是:检测整数中对应掩码为1的位是否都为1。而str1的最后16位是0011001000100010,恰好满足掩码指定的位(第9、12、13位)都为1,因此第一个条件成立并打印,这是符合按位与逻辑的结果,你的预期有误。
正确实现方式
如果你的需求是检测最后16位完全匹配0b0011001000000000(即等于0x3200),需要先提取整数的最低16位,再直接比较,而不是用掩码判断部分位:
普通Python代码修正
str1 = '0001111000000000000001110001101000000001010111010011001000100010' str2 = '0111000000000000000001110001101011111111111100000011001000000000' num1 = int(str1,2) num2 = int(str2,2) # 提取最低16位,再判断是否完全等于目标值 if (num1 & 0xFFFF) == 0x3200: # 0xFFFF是16位全1掩码,用于提取最低16位 print('I would expect no print') if (num2 & 0xFFFF) == 0x3200: print('I should be printed')
Pandas代码修正
同样先提取最低16位再比较:
df2 = df.loc[(df['Telegram_Header'].apply(int, args=(2,)) & 0xFFFF).eq(0x3200)]
按位与&的正确用法补充
按位与&的核心作用是保留指定位的值:
- 掩码中为1的位,会保留原数对应位的值;掩码中为0的位,会将原数对应位清零。
- 若要判断原数中某几位是否全为1,就用原数&掩码,若结果等于掩码,则说明这些位全为1。比如你原来的代码就是这个逻辑,只是不符合你“完全匹配最后16位”的需求。
内容的提问来源于stack exchange,提问作者Phil94
相关产品推荐
相关产品推荐

