按位取反
~就是按位取反的意思
a=0,求~a
按位取反的意思就是0变1,1变0。
对于按位取反,我们做题之前需要记住以下几点
1、每个整数都由32个比特位组成
2、第一位是0的,表示该二进制表示的数为正整数,可以原码=反码=补码
3、第一位是1的,表示该二进制表示的数为负整数,比如
原码:100000…001
反码:111111…110
补码:111111…111(在反码的基础上+1)
补码变回反码就是补码 -1
4、任何情况下时,符号位(就是第一位)不变,但按位取反时除外。
任何情况下按位取反时,所有的1和0都要变(包括符号位)
取反码≠按位取反
现在开始做题
a=0时,求~a
a的原码为000…0000(第一位为0),则
反码为000…0000
补码为000…0000
按位取反,得
111…1111(此时该码的地位仍处于补码)
变回反码
111…1110 (-1后所得)
变回原码
100…0001 (记住符号位是不变的)
求得~a= - 1
再做正整数的
a=3,求~a
原码为000…0011
反码为000…0011
补码为000…0011
按位取反,得
111…1100
变成反码(-1)为(使用二进制高位补低位的方法)
111…1011
变原码为
100…0100
得~a= -4
负整数的情况
a=-2,求~a
原码为1000…0010
反码为1111…1101
补码为1111…1110
按位取反,得
0000…0001
变回反码
0000…0001 (0为第一位,原码=反码=补码)
变回原码
0000…0001
得~a=1
计算方法说清楚了,现在说一下原理:
数字的二进制展示出来给人看的是原码,参与进内存计算的是补码,
也就说加减乘除等等,都是以补码的形式计算出来后,再变回原码显示出来的。