A,原码反码补码
1,二进制
二进制的最高位是符号位,0为正,1为负
例
3 => 0000 0011
-3 => 1000 0011
2,正数
正数的原码,反码,补码都一样(三码合一)
例
3 => 0000 0011(原码)
0000 0011(反码)
0000 0011(补码)
3,负数
负数的反码:原码符号位不变,其他取反(0变1,1变0)
例
-3 =>
原码1000 0011
反码1111 1100
负数的补码:反码加一
负数的反码:补码减一
例
-3 =>
反码1111 1100
补码1111 1101
4,0
0的反码补码都是0
5,计算机运算
计算机运算时,以补码的方式运算,查看运算结果时,需要看原码
例
1=>补码0000 0001
-3=>补码1111 1101
1 - 3 =>补码0000 0100
原码0000 0100
——>
4
1=>补码0000 0001
-3=>补码1111 1101
1 - 3 =>补码1111 1110
反码1111 1101
原码1000 0010
——>
-2
B,位运算
位运算符 | 描述 |
+x,-x,~x | 正,负,按位非NOT |
>> << | 右移 左移 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
1,~按位取反
规则:对数据的每个二进制取反,1为0,0为1
例
~2
原码:0000 0010
补码:0000 0010
2 按位取反
补码:1111 1101
原码:1000 0011
——>
结果:-3
~-2
原码:1000 0010
补码:1111 1110
-2 按位取反
补码:0000 0001
原码:0000 0001
——>
结果:1
2,&按位与
规则:参与运算的两个值,如果两个补码对应的位置都为一,则该位结果为一,否则为0
例
2 & 3
2补码:0000 0010
3补码:0000 0011
2 & 3补码:0000 0010 补码=原码
——>2
3,^按位异或
规则:如果两个补码对应的位置相异,则该位结果为一,否则为0
例
2^-3
2补码:0000 0010
-3补码:1111 1101
2 ^ -3补码:1111 1111
2 ^ -3原码:1000 0001
——>-1
4,按位或
规则:如果两个补码对应的位置有一个为一,则该位结果为一,否则为0
例
2|3
2补码:0000 0010
3补码:0000 0011
2|3补码:0000 0011
——>3
5,<<左移
规则:二进位全部左移n位,n是<<右边的数,且符号位不变,高位丢弃,低位补0
例
5<<1
5补码:0000 0101
5<<1补码:0000 1010 左移一位等于*2
——>10
6,>>右移
规则:二进位全部右移n位,n是<<右边的数,且符号位不变,低位溢出,用符号位补溢出的高位
例
5>>1
5补码:0000 0101
5>>1补码:0000 0010
——>2
C,练习
1,
定义
a=1>>2
b=-1>>2
c=1<<2
d=-1<<2
输出
print(a)
print(b)
print(c)
print(d)
——>
0
-1
4
-4