位运算在下面,点目录部分跳转
机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
那么,这里的 00000011 和 10000011 就是机器数。
真值
机器数第一位为符号位,所以机器数的形式值不等于真正的数值。所以,将带符号位的机器数对应的真正数值称为机器数的真值。例:
0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
一个字节表示范围 -128~127
注:一个+0表示为:00000000,一个-0表示为:1000000,因为符号位不算在里面,所以就会有 两个0,所以从一开始发明二进制的时候,就把-0规定为-128,如此二进制的补码就刚好在计算机中运作中吻合。
反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
负数原码为绝对值二进制最高位取1, 负数的反码是原码(符号位除外)按位取反, 负数补码是反码+1
对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
原码到补码的计算方式:取反+1,
补码到原码的计算方式:-1再取反。
反码求和
0和0相加是0,但要产生一个进位1,0和1相加是1,1和1相加是0。若最高位相加后产生进位,则最后得到的结果要加1
补码求和
补码加法运算:两个相加的数无论正负,只要表示成对应的补码形式,则可直接按二进制规则相加,且符号位作为数的一部分直接参与运算,所得结果就是和的补码形式,用关系式表示(溢出位舍去)
补码于补码的计算结果,还是一个补码。如果需要通过补码计算原码,只需要对这个数字再求补即可。
[x]补 + [y]补 = [x+y]补
2、补码减法运算:
[x-y]补 = [x+(-y)]补 = [x]补 + [-y]补
位运算
左移操作(<<)
规则:
右边空出的位用0填补
高位左移溢出则舍弃该高位。
右移操作(>>)
规则:
左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
低位右移溢出则舍弃该位。
其它的四种位运算:
与运算(&)
1、与0相与可清零
2、与1相与可保留原值
或运算(|)
1、与0相或可保留原值
2、与1相与可齐设1
异或运算(^)
1、与0异或保留原值
2、与1异或比特值反转
3、可通过某种算法,使用异或实现交换两个值
异或运算是有结合律的
取反(~)
位运算概览 对两个数的补码运算
参考资料:
(/zhangziqiu/archive//03/30/ComputerCode.html)
(/yyangblog/archive//01/14/1935656.html)