黑马程序员技术交流社区

标题: (x + ~x = -1)快速由负数的补码推出负数的数值!!!小技巧 [打印本页]

作者: 球球_    时间: 2015-9-7 23:42
标题: (x + ~x = -1)快速由负数的补码推出负数的数值!!!小技巧
本帖最后由 球球_ 于 2015-9-8 23:03 编辑

x + ~x = -1)快速由负数的补码推出负数的数值!!!【原创by球球】

    当我们学习负数的原码,反码,补码的时候会比较疑惑,推倒来推到去结果就弄错了,这里教大家一个小技巧,可以由负数的补码快速的算出负数的值:
    先说说负数怎么由原码推出补码,记忆口诀:按位取反再加1
      举个例子,某个负数原码为      10000000 10110101 00111001 01010011
      按位取反得反码             11111111 01001010 11000110 10101100
      1得补码                 11111111 10110101 11000110 10101101
    这样子我们就算出了一个负数在计算机中的2进制存储数(计算机都是以补码形式储存)
    实际运用中,我们都是先知道负数在计算机的存储(也就是补码),再去计算这个负数的值。
这就需要我们反过来推导,有些同学就会疑惑,而且每次都经过写出补码推导反码,反码再推导原码,由原码再计算数值,太麻烦啦!!!!
另外100000000 00000000000000 0000000这个数,老师教导我们记住表示最小,因为上面的方法也不好推导,补码推反码的时候先减去1得多少?最后一位是0,需要向前借位,直到符号位,但符号位是不能借位的,怎么办?…所以老师只说让我们记住等于最小,可是却让人更疑惑了。
当我们学习位运算的时候,有一个计算方式叫取反~,取反和原码推导反码多么相似!!我们能不能利用它来计算呢?
当然可以!
我们记住一个公式:x + (~x)= -1
为什么会这样呢,我们来推导一下,假如一个数x,其在计算机中的补码为
10010101 1100010101001011 10110111      -------1
对其取反~x得到(和原码推反码的区别在于符号位也变了):
01101010 0011101010110100 01001000   --------2
因为是取反,那么我们可以得到它们的和x + (~x)得值为
11111111 1111111111111111 11111111
经过推导,这个数的值也就是-1(实际上,不管一个数是多少,x + (~x)的值都为-1)
怎么利用这个公式来由补码推导数值呢?
假如一个负数如上面的1,我们对其取反可得到一个正数如上面的2,这时候我们就得到了一个正数的补码,计算出其数值为0110101000111010 10110100 01001000也就是十进制1782232136,再根据公式x + (~x)= -1,我们就可以计算出x的数值为- 1782232136。
怎么样,方便吧!!
    我们再利用公式推导一下100000000 0000000 0000000 00000000,取反得01111111 11111111 1111111 1111111,其为正数,数值为2147483647,那么3得数值即为-2147483648,查看一下int的取值范围(-2147483648~~2147483647),其正好是int的最小值,这样我们就能推导出来,而不是只需要记住其表示最小值。

作者: wangzhuo    时间: 2015-9-7 23:46
不明觉厉!!!
作者: 方育伟    时间: 2015-9-8 22:51
太长不看

作者: 我螃蟹不是虾    时间: 2015-9-8 22:51
大神 膜拜
作者: a6658637    时间: 2015-9-8 22:51
头看晕了~~~~~~~~~~~~~~~~~~~~~~~
作者: 生平    时间: 2015-9-8 22:51
一起加油。
作者: li634775677    时间: 2015-9-8 22:51
厉害厉害!!
作者: JavaProgrammer    时间: 2015-9-8 22:52
已阅读,帮我也刷刷
作者: Jiwei    时间: 2015-9-8 23:02
100000000 0000000 0000000 00000003,取反得01111111 11111111 1111111 1111111 表示没看懂~!
作者: 球球_    时间: 2015-9-8 23:03
Jiwei 发表于 2015-9-8 23:02
100000000 0000000 0000000 00000003,取反得01111111 11111111 1111111 1111111 表示没看懂~!

键盘敲错了,已改




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