首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python位~运算符

Python位~运算符
EN

Stack Overflow用户
提问于 2022-10-12 10:45:46
回答 1查看 52关注 0票数 -1

之前曾问过的几个问题,比如,只提到了为什么会出现这种情况,即2的恭维。我需要帮助如何转换这个:

代码语言:javascript
运行
复制
print("if ~(0b11011111) is "+str(bin(~(0b1101111))) +" not 0b00100000")
print("and ~(0b00100000) is  " +str(bin(~(0b00100000)))+" not 11011111")

产出:

代码语言:javascript
运行
复制
if ~(0b11011111) is -0b1110000 not 0b00100000
and ~(0b00100000) is  -0b100001 not 11011111

有人能帮我做这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 09:19:55

当你有一个固定数量的比特,倒置它们是很容易的-只要倒置它们。例如,我们使用4位整数,5 (0b0101)的逆是0b1010。

然而,Python有任意大小的整数,这使得事情变得有点诡计。如果我们倒置5 (0b101),结果是1010还是11111010或1111111111111010还是什么?因此,Python 定义从整数的角度(在数学意义上,与位字符串相反);~x ≝ -(x+1)。为什么是这样的定义?当处理两个负数的补码表示时,neg(x) = inv(x)+1,所以inv(x) = neg(x)-1 = -(x+1)是有意义的.这就是为什么~5会出现在-6上。

这就是为什么你会得到负数,但是你怎么得到你期望的正值呢?语言规范没有明确地说明它,但是按位的&|运算符似乎把否定词视为左边的“足够”的负数。这意味着,如果你只屏蔽了尽可能多的右边位,你就会得到一个正数。例如,如果我们想反转一个4位数字5,我们可以做bin(~0b101 & 0b1111并得到预期的0b1010

您似乎期望8位数字,例如bin(~0b00100000 & 0xff)给您0b11011111

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74040562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档