原码反码补码介绍
原码 就是前面所介绍的二进制定点表示法,即最高位为符号位,“ 0 ”表示正,“ 1 ”表示负,其余位表示数值的大小。
反码 表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码 表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加 1 。
补码详细介绍
补码是为了表示一个负数的二进制形式。
其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。
例如-5
先求出5的二进制数 : 0000 0000 0101
然后将各个位上0变1,1变0 : 1111 1111 1010
最后再加1 : 1111 1111 1011
按位与(&)
运算的两个数,转换算为二进制后,进行与(&)运算。
当相应位上的数都是1时,该位取1,否则该为0。
例如5 & -5
5 : 0000 0000 0101
-5 :1111 1111 1011
答案 : 0000 0000 0001
按位或(|)
运算的两个数,转换为二进制后,进行或(|)运算。
只要相应位上存在1,那么该位就取1,如果都不为1,就为0。
还是5 | -5
0000 0000 0101
1111 1111 1011
可以看到每一位中其中一个都有1
答案 :1111 1111 1111
按位异或(^)
运算的两个数,转换成二进制数后,进行异或(^)运算
如果相应位置上的数相同,该位取0,如果不同改位取1。
5 ^ -5
0000 0000 0101
1111 1111 1011
答案: 1111 1111 1110
同时任何数异或0都是其本身,一个数如果异或自己则等于0
这样我们可以用异或来交换两个数的值
比如交换x,y的值
x ^= y; x = x ^ y
y ^= x; y = y ^ x ^ y
x ^= y; x = ( x ^ y ) ^ (y ^ x ^ y) ; --------- //最后一步 x ^= y 时 x = x ^ y; y = y ^ x ^ y
左移(<<)
将一个数二进制下的数向左移若干位,
比如 x << y 就是将二进制下的x 向左移 y 位
例 : 5 << 5
5 : 0000 0000 0101
5 << 5 : 0000 1010 0000
在10进制下就等于160
我们可以思考一下,在十进制中,一个数每乘一次10就向左进一位。
那么在二进制中,同10进制一样,二进制中每乘一次2就向左进一位,
那么一个数左移x 就等价于一个数乘 2x。
右移(>>)
将一个数在二进制下右移若干位
与左移用法相同
例 5 >> 2
5:0000 0000 0101
5 >> 2 : 0000 0000 0001
十进制下等于1
这里与左移类似,十进制下每除10整数位就退一位
那么右移就等价于除了几次2
同时右移运算是向下取整的
取反(~)
其实在说补码的时候,取反就已经说了,就是将取反的数在二进制下的每一位取相反的数
5 : 0000 0000 0101
~5 : 1111 1111 1010