计算机里面的信息的交换是采用2进制的方式,因为机器只能识别0和1两个数字。所以有必要对位运算的知识做一个整理。
记得很多年以前,我刚上大一的时候,常常会想一个问题,为什么数组的第一个元素的下标是0,为什么字符串的首字母下标也是0?如果是1那不挺好嘛,省得下标换来换去特别麻烦。后来知道了,原来都是二进制惹的祸,因为2的0次方等于1,所以计算机里面用0代表1也就无可厚非了。
基础知识
原码+补码=0
补码=反码+1
例子1:0的相反数是0
0的原码 0 0...0 0
0的反码 1 1...1 1
0的补码 1 0 0...0 0 (1溢出,所以为0 0...0 0)
例子2:1的相反数是-1
1的原码 0 0…0 1
1的反码 1 1…1 0
1的补码 1 1…1 1
例子3:如果用二进制表示-1~-16 "(1)"代表这些数的前面全是1.如果是32位integer 0011代表28个1然后0011
-1~-16
(1)1 1 1 1,
(1)1 1 1 0,
(1)1 1 0 1,
(1)1 1 0 0,
--------
(1)1 0 1 1,
(1)1 0 1 0,
(1)1 0 0 1,
(1)1 0 0 0,
--------
(1)0 1 1 1
(1)0 1 1 0
(1)0 1 0 1
(1)0 1 0 0
(1)0 0 1 1
(1)0 0 1 0
(1)0 0 0 1
(1)0 0 0 0
例子4:为什么极小值的相反数也是极小值
我们知道,在32位的integer型整数中,最小值是-2的31次方,它的补码也是它本身。为什么会出现这种情况呢?
我们先从2的31次方-1开始分析,因为2的31次方-1的相反数是-2的31次方+1
原码: 0 1…1 1
反码: 1 0…0 0
补码: 1 0…0 1
01…11代表2的31次方减1
10…01代表-2的31次方+1
那么怎么处理2的31次方呢?
原码: 10…00
反码: 01…11
补码: 10…00
原码等于补码,所以说2的31次方是极大数也是极小数。即2的31次方=-2的31次方
由于10…00首位为1,符号位为1, 所以代表-2的31次方更加合适。