Java中移位操作符问题!关于~的

原来缘来 2011-03-26 10:57:40

public class Sample {
public static void main(String[] args) {
int a=4;
System.out.println(~a);
}
}


求高手解释一下,为什么输出-5,麻烦讲清楚点
...全文
149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongxingzhen123 2011-03-27
  • 打赏
  • 举报
回复
楼上正解
Ganymede 2011-03-27
  • 打赏
  • 举报
回复
(~a);是逐位取反的意思。int是4位 ,a的值为4,所以他的二进制为00000000 00000000 00000000 00000100
取反是11111111 11111111 11111111 11111011 最高位为符号位,1为负 0为正,而负数的表示为他的补码,转换为十进制为 除了符号位不变,其余取反加1 也就是10000000 00000000 00000000 00000101 结果就是-5啦
zqfddqr 2011-03-27
  • 打赏
  • 举报
回复
2楼正解
Ganymede 2011-03-27
  • 打赏
  • 举报
回复
我上面可能解释的不是很详细。下面详细说下,相信以后楼主一定对这种题颇有心得了。呵呵
在二进制的世界里,负数是以补码的形式存放在内存中的,而正数就是以原码的形式存放的,所以下面我只解释下补码的计算,补码=反码+1。所谓的反码就是 将负数的原码除最高位不变(也就是符号位,为1时,表示负,为0时,表示正。下面红色标识)以外的其他位都按位取反。(下面还是以-5为例子)
-5原码:10000000 00000000 00000000 00000101。那么-5的反码相应就是:
111111111 11111111 11111111 11111010
这时求负数的补码就用反码加1了。也就是负数的最终保存形式:11111111 11111111 11111111 11111011
那么针对楼主说的,int i=-5;也就是将11111111 11111111 11111111 11111011按位取反了,所以结果是:
00000000 00000000 00000000 00000100。所以System.out.println(~i);输出的是4。


Ganymede 2011-03-27
  • 打赏
  • 举报
回复
最高位就是二进制数从左边数第一个,也就是符号位。
这是-5的原码:10000000 00000000 00000000 00000101,但是负数的二进制在计算机里是以补码的形式存放的。
这是-5的补码:11111111 11111111 11111111 11111011,这也是-5在内存里存储的最终形式。
然后是按位取反,结果是:00000000 00000000 00000000 00000100 就是十进制的4
原来缘来 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 followme_1987 的回复:]
(~a);是逐位取反的意思。int是4位 ,a的值为4,所以他的二进制为00000000 00000000 00000000 00000100
取反是11111111 11111111 11111111 11111011 最高位为符号位,1为负 0为正,而负数的表示为他的补码,转换为十进制为 除了符号位不变,其余取反加1 也就是10000000 00000000 00000000 0000010……
[/Quote]
二楼的最高位指的那位?顺手牵羊解释一下
int i=-5;
System.out.println(~i);
为什么输出4
qybao 2011-03-26
  • 打赏
  • 举报
回复
二进制运算
自己用二进制的方式取反后看看是什么结果就知道了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧