正数的源码与补码、反码一致;负数的反码是将其源码除符号位之外的各位求反,负数的补码是将其源码出符号位之外的各位求反后再加1。
总结所有来说,就是进行运算的时候是各个数的补码,最后得出来的也是结果的补码。
按位运算就把数字转换为机器语言——二进制的数字来运算的一种运算形式。在计算机系统中,数值一律用补码来表示(存储)。
按位与 &
eg:3&5
正数补码与源码一致,
3的补码为 11
5的补码为101
按位与之后的结果为001,结果为1
a = 3
b = 5
print bin(3)
print bin(5)
print 3&5
print bin(3&5)
>>0b11
>>0b101
>>1
>>0b1
eg:-1&-2
负数补码为源码除符号位取反后再加1
-1源码为1000 0001
-1反码为1111 1110
-1补码为1111 1111
-2源码为1000 0010
-2反码为1111 1101
-2补码为1111 1110
(1111 1111)&(1111 1110)=(1111 1110)
结果为-2
a = -1
b = -2
print bin(a)
print bin(b)
print a&b
print bin(a&b)
>>-0b1
>>-0b10
>>-2
>>-0b10
eg:-2&6
-2补码为1111 1110
6源码/补码为0000 0110
(1111 1110)&(0000 0110)=(0000 0110)
正数补码即为源码,最后结果为6
a = -2
b = 6
print bin(a)
print bin(b)
print a&b
print bin(a&b)
>>-0b10
>>0b110
>>6
>>0b110
按位并 |
eg:4|7
4补码为0000 0010
7补码为0000 0111
结果为0000 0111
正数补码即源码,结果为7
a = 4
b = 7
print bin(a)
print bin(b)
print a&b
print bin(a&b)
>>0b10
>>0b111
>>7
>>0b111
按位异或 ^
eg:-3^2
-3源码为1000 0011
-3反码为1111 1100
-3补码为1111 1101
2补码为0000 0010
结果为1111 1111
还原为反码为1111 1110
还原为源码为1000 0001
即结果为十进制-1
按位翻转 ~
最快捷的做法是~x = -x-1
eg:~3
3的补码为0000 0011
翻转为 1111 1100
还原为反码为 1111 1011
还原为源码为 1000 0100
即结果为十进制-4
eg:~-2
-2源码为 1000 0010
-2反码为 1111 1101
-2补码为 1111 1110
~~2为0000 0001
即结果为十进制1