黑马程序员技术交流社区

标题: 二进制问题 [打印本页]

作者: 陈志伟    时间: 2012-4-8 16:11
标题: 二进制问题
public class Test {
  public static void main(String[] args) {
  System.out.println("~2="+~2);
  System.out.println("~-2="+~-2);
}
}
这两个运算结果是-3,1,但不明白具体是怎么得到的!
作者: 贠(yun)靖    时间: 2012-4-8 16:26
本帖最后由 贠(yun)靖 于 2012-4-8 16:32 编辑

2     0000 。。。。 0010
~2    1111 。。。。 1101   得到反码  是一个负数 要转正补码
取反  1000 。。。。 0010              补码:整数的补码与整数相同,负数的补码是把负数的绝对值取反再加1
加1   1000 。。。。 0011  所以-3

-2    1111 。。。。1110   算出补码
~2   0000。。。。 0001  1  是个正数  整数的补码就是该正数  不用转了  
  数字在计算机中的体现都是以补码的形式体现的    所以在做运算 时 要先转成补码  
作者: 黑马老兵    时间: 2012-4-8 16:27
~2 对2进行取反,我们都知道在java中负数二进制的表现形式是正数取反加1对2进行取反再加1是-2所以直接对2取反是-3.如果你不明白,你将2转换为2进制是0000 0010 取反就是1111 1101我们知道这是一个负数,那么它是谁的负数呢?我们先将1111 1101减去一个1得到的是1111 1100.然后再取反是 0000 0011 转成十进制是3所以1111 1101是-3.哎  ,这么讲不知道你懂了么。
作者: pray    时间: 2014-4-26 05:55
 楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子。实在是我三生之幸啊。看完楼主的这个帖子之后,我竟感发生出一种无以名之的悲痛感??啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫的把楼主的这个帖子收藏了。我内心的那种激动才逐渐平复下来。可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止。  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2