1.原码补码和反码
规则:正数的原码反码补码都相同,负数的反码是符号位不变也就是永远是1,其他位置取反,
补码是反码+1的结果
比如:
1
原码:0000 0001
反码:0000 0001
补码:0000 0001
-1
原码:1000 0001
反码:1111 1110
补码:1111 1111
2.位运算
1.与运算(and …&):
两个开关都为1时灯泡才亮,基于此逻辑为与逻辑
1000 1111
1011 0100
------------与运算
1000 0100
2.或运算(or …|)
两个开关只要有一个为1,就可以亮此逻辑为或逻辑
1000 1111
1011 0100
------------或运算
1011 1111
3.异或运算(xor …^)
必须要两个值不一样才能灯泡亮,此逻辑为异或
1000 1111
1011 0100
------------异或运算
0011 1011
4.非运算(not …!)
就是取反操作
1000 1111
----------非运算
0111 0000
5.位运算(移动位)
左移(shl <<):
0000 0001
左移后:
0000 0010
规则:所有二进制位左移一个位置,高位丢弃,低位补零,左边为高位,右边是低位。
可以发现,左移相当于原来的数字乘2.
右移:(>>……shr)
0000 1111
右移后:
0000 0111
从15变成了7
相当于除二
规则和左移对应相反
2.位运算实现加减乘除
1.加法
假如我们要算5+6=?
// 首先转换5和6使其成为二进制数
5:0000 0101
6:0000 0110
11: 0000 1011
第一步: 进行异或运算,如果没有进位,可以直接得出结果
0000 0101
0000 0110
---------- 异或
0000 0011
第二步:用与运算判断有没有进位,如果结果是0则说明没有进位,即可得出结果
0000 0101
0000 0110
---------- 与运算
0000 0100
第三步:将与运算的结果左移以为,得到进位后的结果
0000 1000
第四步:继续进行异或操作
0000 0011
0000 1000
---------异或
0000 1011
第五步:继续通过与操作判断是否需要进位
0000 0011
0000 1000
---------与
0000 0000
第六步:结果为0 , 发现不需要进位了,得出结果
结果为 0000 1011
等于十进制的11,结果正确
2.减法
假如计算机要算7-8=?
减法就是加上这个数的相反数
7: 0000 0111
-8: 1000 1000
-8的反码: 1111 0111
-8的补码: 1111 1000
第一步:将7和-8的补码进行异或运算
0000 0111
1111 1000
------------异或操作
1111 1111
第二步:判断是否需要进位
0000 0111
1111 1000
------------与操作
0000 0000
第三步:得出结果 ff就是-1 结果正确
3.乘法
所谓乘法,譬如x*y就是x个y相加,实质还是加法
4.除法
所谓除法,就是减法,譬如x/y,就是让z=x-y,一直减到z<0,统计一共减了多少个y,就是结果