在 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的主要内容,如果未能解决你的问题,请参考以下文章

C语言有效位

matlab可以实现按位操作吗?

python进阶练习之——按位与

Leetcode练习(Python):位运算类:第201题:数字范围按位与:给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按

了解按位与运算符

LeetCode Java刷题笔记—201. 数字范围按位与