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

按位not运算符
EN

Stack Overflow用户
提问于 2010-03-25 14:39:50
回答 9查看 52.9K关注 0票数 45

为什么按位操作(~0);打印-1?在二进制中,0不应该是1。为什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-03-25 15:10:38

实际上你们已经很接近了。

以二进制表示的

应为1,而不是0

是的,当我们谈到一点的时候,这是绝对正确的。

然而,值为0的int实际上是32位全零!~将所有32个0反转为32个1。

代码语言:javascript
运行
复制
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"

这是-1的两个补码表示。

类似地:

代码语言:javascript
运行
复制
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"

也就是说,对于二进制补码表示~1 == -2中的32位无符号int

进一步阅读:

  • Two's complement
    • 这是Java (以及其他语言)用来在Java中表示有符号数值的系统

  • JLS 15.15.5 Bitwise complement operator ~
    • “请注意,在所有情况下,~x都等于(-x)-1"

票数 75
EN

Stack Overflow用户

发布于 2010-03-25 14:44:26

您实际说的是~0x00000000,结果是0xFFFFFFFF。对于java中的(带符号的) int,这意味着-1。

票数 13
EN

Stack Overflow用户

发布于 2010-03-25 14:44:36

~是一个按位运算符。

代码语言:javascript
运行
复制
~0 = 1 which is -1 in 2's complement form  

http://en.wikipedia.org/wiki/Two's_complement

一些二进制补码形式的数字和它们的位不是~ (就在它们下面):

0 1 1 1= 127

1 0 0 0=−128

0 1 1 1 0= 126

1 0 0 0 1=−127

1 1 1=−1

0 0 0

1 1 1 0=−2

0 0 0 1=1 1 0 0 0 1=−127

0 1 1 1 0= 126 1 0 0 0=−128

0 1 1 1= 127

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

https://stackoverflow.com/questions/2513525

复制
相关文章

相似问题

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