首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按位运算一元~ (invert)

按位运算一元~ (invert)
EN

Stack Overflow用户
提问于 2011-09-02 10:44:23
回答 5查看 99.1K关注 0票数 75

我对~操作符有点迷惑。代码如下:

代码语言:javascript
复制
a = 1
~a  #-2
b = 15
~b  #-16

~是如何工作的?

我想,~a应该是这样的:

代码语言:javascript
复制
0001 = a
1110 = ~a 

为什么不行?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-02 10:46:31

你说的完全正确。它是two's complement整数表示的产物。

在16位中,1表示为0000 0000 0000 0001。倒置后得到的是1111 1111 1111 1110,它是-2。同样,15是0000 0000 0000 1111。倒置后得到的是1111 1111 1111 0000,它是-16。

一般而言,~n = -n - 1

票数 69
EN

Stack Overflow用户

发布于 2012-10-09 06:41:52

'~‘运算符的定义为:“x的逐位求逆定义为-(x+1)。它仅适用于整数。”Python Doc - 5.5

这句话的重要部分是,这与“整数”(也称为整数)有关。你的例子代表了一个4位的数字。

代码语言:javascript
复制
'0001' = 1 

4位数的整数范围是'-8..0..7‘。另一方面,你可以使用‘无符号整数’,不包括负数,你的4位数的范围将是'0..15‘。

因为Python对整数进行操作,所以您所描述的行为是预期的。整数是用二的补码表示的。在4位数字的情况下,这看起来如下所示。

代码语言:javascript
复制
 7 = '0111'
 0 = '0000'
-1 = '1111'
-8 = '1000'

Python使用32位表示整数,如果您使用的是32位操作系统。您可以使用以下命令检查最大整数:

代码语言:javascript
复制
sys.maxint # (2^31)-1 for my system

如果你想要一个无符号的整数返回给你4位数,你必须掩码。

代码语言:javascript
复制
'0001' = a   # unsigned '1' / integer '1'
'1110' = ~a  # unsigned '14' / integer -2

(~a & 0xF) # returns 14

如果您想要获得一个无符号的8位数字范围(0..255),只需使用:

代码语言:javascript
复制
(~a & 0xFF) # returns 254
票数 33
EN

Stack Overflow用户

发布于 2017-10-27 01:57:38

看起来我找到了更简单的解决方案,可以实现所需的功能:

代码语言:javascript
复制
uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFF
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7278779

复制
相关文章

相似问题

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