黑马程序员技术交流社区

标题: 请问~符号是什么意思 [打印本页]

作者: 325122062q    时间: 2015-7-10 20:53
标题: 请问~符号是什么意思
为什么~20  输出是-21  请大神们告诉我一下 谢谢了
作者: αメ炫    时间: 2015-7-10 20:53
~是按位取反操作符

20的二进制是10100,int类型占4个字节,计算机存储是以补码存储,正数原码=反码=补码,所以20存储为
00000000 00000000 000000000 00010100
~按位取反
11111111  11111111  11111111 11101011
这个是补码实际值还要计算,怎么算一个补码的实际值?

计算机存储的是补码,符号位是1是个负数,负数的原反补是不一样的,具体公式有:补码=反码+1,反码是除符号位取反,原码=补码再求补或者反码再求反,这里我们已经知道了补码,所以把上面的一串再求补就能得到原码,求补就是反码+1
11111111  11111111  11111111 11101011
求反码(除符号位取反)得:
10000000 00000000 000000000 00010100
+1得:
10000000 00000000 000000000 00010101
这个原码的值就是-21

作者: llo    时间: 2015-7-10 21:04
20的补码是010100,对其反的补码是101011,转换成原码是110101
作者: Excalibur    时间: 2015-7-10 21:05
~是按位取反运算符;20的二进制码为 0001_0100
作者: llo    时间: 2015-7-10 21:05
20的补码是010100,对其反的补码是101011,转换成原码是110101  转换后是-21
作者: Excalibur    时间: 2015-7-10 21:09
~是按位取反运算符;20的二进制码为 0001_0100;取反后为 1110_1011;首位的‘1’表示符号位(为负数)。补码1110_1011转换成反码为:1110_1010;再转成原码:1001_0101;即为-21.
作者: 爱楚楚    时间: 2015-7-10 21:32
~是按位取反,(1变0,0变1)符号位也变,得到的是补码,结果取反加一(符号位不变)
作者: liuch111    时间: 2015-7-10 21:55
αメ炫   讲的好仔细·····
学习了
作者: 康恒强    时间: 2015-7-10 22:04
都挺厉害
作者: Poskey    时间: 2015-7-10 23:09
按位取反~可以用来交换两个数
作者: longbao    时间: 2015-7-11 00:02
计算机中数据的运算和存储都是以二进制的补码进行的。 ~是位运算中的反码运算符。 首先,正数的原码,反码和补码都是一样的。 20在内存中的二进制表示是: 00000000 00000000 00000000 00010100 ~20就是对20的补码进行取反:11111111 11111111 11111111 11101011   (注意:~运算时,符号位也要参与)            那么获得的补码对应的十进制数是什么呢? 我们知道,求一个十进制数的二进制的补码的步骤是:二进制原码取反后+1即得补码。 难么,我们接下来可以由获得的补码反向推出原码,方法是: 补码:11111111 11111111 11111111 11101011   反码:11111111 11111111 11111111 11101010        原码:10000000 00000000 00000000 00010101      (注意:这里在取得反码的时候,符号位不参与运算,因为要保证数据的原样)  可以知道,该原码所表示的十进制数是-21。即得到结果。
作者: 黑马和大灰狼    时间: 2015-7-11 01:02
按位取反
作者: 李佑明    时间: 2015-7-11 10:52
   按位取反运算符~

作者: 徐鹏辰    时间: 2015-7-11 16:31
~是java中的一个位运算符  反码,
20的二进制是0001_0100,与之对应的反码是1110_1011。

-21的二进制(涉及到负数的表现形式的知识内容:负数的的二进制 = 该数的 绝对值取反 + 1)
21的二进制是0001_0101,反码为1110_1010,
1的二进制是0000_0001,
故,-21的二进制是 1110_1011,与20的反码相等。

    1110_1010
  +0000_0001
——————
    1110_1011


作者: wuchangfeng    时间: 2015-7-11 21:03
~是按位取反操作符
  
作者: 朝花夕拾7    时间: 2015-7-11 21:37
按位取反
作者: 1木头1    时间: 2015-7-11 21:45
首先你要知道,数据运算和存储在计算机中都是以二进制补码的形式进行的。好了在此前提下我们解题:

无标题.png (30.84 KB, 下载次数: 157)

解题示意图

解题示意图

作者: kime    时间: 2015-7-11 23:56
~:0变1,1变0 取反符号
作者: ALin    时间: 2015-7-11 23:56
~是java/c++中的一个位运算符  即按位取反,1变0,0变1.
20的二进制是0001_0100,与之对应的反码是1110_1011。

-21的二进制(负数的的二进制 = 该数的 绝对值取反 + 1)
21的二进制是0001_0101,反码为1110_1010,
1的二进制是0000_0001,
即-21的二进制是 1110_1011,与20的反码相等,所以~20=21

作者: yongwei    时间: 2015-7-12 01:18
~是按位取反运算符;先把数字(20)转换为 二进制数,求它补码,并对补码进行取反,然后用取反后的数末尾加1 ,再取反(就是逆推原码)把得到的结果转换为十进制数就OK了
作者: 秀丽xl    时间: 2015-7-12 06:52
这是取反运算符,这是一个关于二进制的运算符,教你一个很巧妙的方法,那就是:取反的那个数+取反之后的数=-1;这样计算很快!!
作者: fantianfei    时间: 2015-7-12 09:13
~是取反啊,哥们,20先取反再求反码补码,然后可以得出是-21哦。
作者: 西门雅虎    时间: 2015-7-12 10:05
#在这里快速回复#~是按位取反20的补码是010100,对其反的补码是101011。然后再转换成原码是110101.yejiu
作者: xiaoqiao    时间: 2015-7-12 11:38
~按位取反运算符,,只要记住计算机底层存储的都是以补码的形式存储的,就知道怎么算了
作者: A等待着    时间: 2015-7-12 20:47
按位求反,,记住规律  结果一定是-(i+1),i就是你所输入的数字!!!
作者: 无峰    时间: 2015-7-12 20:54
~是反码运算符20的二进制为  0000 0000 0001 0100
       取反后为  1111 1111 1110 1011
而-21的二进制表示为21的二进制取反加1,即
20      0000 0000 0001 0101
取反   1111 1111 1110 1010
+1      1111 1111 1110 1011
可以看出~20=-21





捕获.JPG (76.75 KB, 下载次数: 61)

捕获.JPG

作者: norwood    时间: 2015-7-13 07:22
都可以咯
作者: 325122062q    时间: 2015-7-13 12:51
都是大神啊   在这里谢谢了
作者: 繁华落尽    时间: 2015-7-16 21:18
赞一个,加油.
作者: guohuaxin    时间: 2015-7-24 23:23
位运算,按位取反




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