在 Python 中按位与 0xFFFFFFFF
Posted
技术标签:
【中文标题】在 Python 中按位与 0xFFFFFFFF【英文标题】:Bitwise AND with 0xFFFFFFFF in Python 【发布时间】:2021-10-27 09:23:25 【问题描述】:5 & 0xFFFFFFFF # 5
-5 & 0xFFFFFFFF # 4294967291
在 Python 中,为什么将负数与 0xFFFFFFFF 按位与会给出不同的结果?由于 0 & 1 = 0 和 1 & 1 = 1,是否应该按位 AND 与 0xFFFFFFFF (11111111111111111111111111111111) 的数字保持每个数字是什么?
【问题讨论】:
0xFFFFFFFF 在 Python 中不是负数。如果您仅限于 32 位整数,那么它会是。在 Python 中,这相当于 +4294967295 Python 整数没有固定宽度,因此负数被视为具有无限数量的前导 1。通过与0xFFFFFFFF
进行与运算,您将丢弃除 32 个低位之外的所有位。不要使用0xFFFFFFFF
,而是使用-1
。
也许您可以将其与正数相乘并与 -1 相乘?
【参考方案1】:
为了进一步说明,在python中,要获得-5的位表示,您应用二进制补码规则,即:从5开始,翻转位,加1
-5 -> 0000....0000000101 (5 in binary) -> 1111....1111111010 (flipped) -> 1111....1111111011 (+1)
当您使用0xFF
&
时,您正在这样做:
1111....1111111011
& 0000....0011111111
= 000000000011111111 = +255
我使用了 0xFF,但这并不重要,因为正如 @Tom Karzes 所提到的,
Python 整数没有固定宽度,因此处理负数 因为有无限数量的前导 1。 并且正数有无限个前导 0。
【讨论】:
以上是关于在 Python 中按位与 0xFFFFFFFF的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):位运算类:第201题:数字范围按位与:给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按