按位取反(~)
二进制数在内存中是以补码的形式存放的
1、原码、反码、补码
1.1、正数
- 原码:符号位0(代表+号),加上数字的二进制形式
- 正数原码、反码、补码相等
1.2、负数
- 原码:符号位1(代表-号),加上数字的二进制形式
- 反码:相对于原码符号位不变,数值位依次取反(0变1,1变0)
- 补码:相对于原码符号位不变,数值位依次取反,再加1(即补码=反码+1)
1.2、零
- 0有+0和-0两种形式,分别按照上面的计算即可
+0:
1. 计算原码:0000
2. 计算补码:0000(正数原码与补码相同)
3. 对补码依次取反:1111(取反后数字的补码,由符号位可知为负数)
4. 取反后数字反码:1110(负数的反码=补码-1)
5. 取反后数字原码:1001(相对于反码符号位不变,数值位依次取反)
6. 转化为十进制:-1
-0:
1. 计算原码:1000
2. 计算反码:1111(相对于原码符号位不变,数值位依次取反)
3. 计算补码:0000(负数补码=反码+1)
4. 对补码依次取反:1111(取反后数字的补码,由符号位可知为负数)
5. 取反后数字反码:1110(负数的反码=补码-1)
6. 取反后数字原码:1001(相对于反码符号位不变,数值位依次取反)
7. 转化为十进制:-1
为什么-0的补码是0000?
2、按位取反原理
- 对数字的补码(即内存中的存储形式),进行依次取反,得到取反后数字的补码,然后将补码转换为原码,再转为10进制数即为按位取反后的数值
示例(以四位二进制为例)
+5:
1. 计算原码:0101
2. 计算补码:0101(正数原码与补码相同)
3. 对补码依次取反:1010(取反后数字的补码,由符号位可知为负数)
4. 取反后数字反码:1001(负数的反码=补码-1)
5. 取反后数字原码:1110(相对于反码符号位不变,数值位依次取反)
6. 转化为十进制:-6
-4:
1. 计算原码:1100
2. 计算反码:1011(相对于原码符号位不变,数值位依次取反)
3. 计算补码:1100(负数补码=反码+1)
4. 对补码依次取反:0011(取反后数字的补码,由符号位可知为正数)
5. 取反后数字原码:0011(正数原码、反码、补码相同)
6. 转化为十进制:+3
本文来自博客园,作者:这货不是古月先生,转载请注明原文链接:https://www.cnblogs.com/gu-yue-hu/p/16033852.html