A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 325122062q 中级黑马   /  2015-7-10 20:53  /  6621 人查看  /  30 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
为什么~20  输出是-21  请大神们告诉我一下 谢谢了

最佳答案

查看完整内容

~是按位取反操作符 20的二进制是10100,int类型占4个字节,计算机存储是以补码存储,正数原码=反码=补码,所以20存储为 00000000 00000000 000000000 00010100 ~按位取反 11111111 11111111 11111111 11101011 这个是补码实际值还要计算,怎么算一个补码的实际值? 计算机存储的是补码,符号位是1是个负数,负数的原反补是不一样的,具体公式有:补码=反码+1,反码是除符号位取反,原码=补码再求补或者反码再求反,这里我们已 ...

点评

请尽快设置最佳答案。  发表于 2015-7-13 10:00

30 个回复

倒序浏览
~是按位取反操作符

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
回复 使用道具 举报
20的补码是010100,对其反的补码是101011,转换成原码是110101
回复 使用道具 举报
~是按位取反运算符;20的二进制码为 0001_0100
回复 使用道具 举报
20的补码是010100,对其反的补码是101011,转换成原码是110101  转换后是-21
回复 使用道具 举报
~是按位取反运算符;20的二进制码为 0001_0100;取反后为 1110_1011;首位的‘1’表示符号位(为负数)。补码1110_1011转换成反码为:1110_1010;再转成原码:1001_0101;即为-21.
回复 使用道具 举报
~是按位取反,(1变0,0变1)符号位也变,得到的是补码,结果取反加一(符号位不变)
回复 使用道具 举报
αメ炫   讲的好仔细·····
学习了
回复 使用道具 举报
都挺厉害
回复 使用道具 举报
Poskey 来自手机 中级黑马 2015-7-10 23:09:41
10#
按位取反~可以用来交换两个数
回复 使用道具 举报
计算机中数据的运算和存储都是以二进制的补码进行的。 ~是位运算中的反码运算符。 首先,正数的原码,反码和补码都是一样的。 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:02
12#
按位取反
回复 使用道具 举报
   按位取反运算符~
回复 使用道具 举报
~是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

回复 使用道具 举报
~是按位取反操作符
  
回复 使用道具 举报
按位取反
回复 使用道具 举报
首先你要知道,数据运算和存储在计算机中都是以二进制补码的形式进行的。好了在此前提下我们解题:

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

解题示意图

解题示意图
回复 使用道具 举报
kime 中级黑马 2015-7-11 23:56:47
18#
~:0变1,1变0 取反符号
回复 使用道具 举报
ALin 中级黑马 2015-7-11 23:56:59
19#
~是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
回复 使用道具 举报
~是按位取反运算符;先把数字(20)转换为 二进制数,求它补码,并对补码进行取反,然后用取反后的数末尾加1 ,再取反(就是逆推原码)把得到的结果转换为十进制数就OK了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马