按位运算就把数字转换为机器语言->二进制的数字来运算的一种运算形式。html
& 按位与运算符:参与运算的两个值,若是两个相应位都为1,则该位的结果为1,不然为0 | 按位或运算符:参与运算的两个值,只要其中有一个为1,则该位结果就为1 ^ 按位异或运算符:当两个对应的二进位相异时,结果为1 ~ 按位取反运算符:对数据的每一个二进制位取反,即把1变为0,把0变为1。将二进制数+1以后乘以-1,即~x=-(x+1) << 左移动运算符:运算数的各二进位所有左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0 >> 右移动运算符:把">>"左边的运算数的各二进位所有右移动若干位,">>"右边的数指定移动的位数
只有按位取反运算符是单目运算符,其余都是双目运算符。python
a = 60 # 0011 1100 b = 13 # 0000 1101 print(a&b) # 12 print(a|b) # 61 print(a^b) # 49 # 按位取反,1100 0011 print(~a) # -61 # 向左移动两位,1111 0000 print(a<<2) # 240 # 向右移动两位,0000 1111 print(a>>2) # 15
计算机中的符号数有三种表示方法,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
在计算机系统中,数值一概用补码来表示和存储。.net
原码: 正数转化为二进制,负数第一位取1。5=>0b101,1=>0b1,-1=>-0b1 1:0000 0001 -1:1000 0001 反码: 正数的反码与原码相同,负数的反码符号位不变其他按位取反 1:0000 0001 -1:1111 1110 补码:正数的补码与原码相同,负数的补码符号位不变其他按位取反后+1 1:0000 0001 -1:1111 1111
负数的表示方法 - 早期数字电路的CPU中的运算器实现了加法器,可是没有减法器,减法要转换成加法 - 负数在计算机中使用补码存储,-1的补码为 1111 1111 - 5-1 => 5+(-1)直觉上是0b101-0b1,其实计算机中是0b101+0b11111111,溢出位舍弃 5+(-1)两个二进制数相加,逢2进1 0000 0101 1111 1111 --------- 0000 0100
print(~12) # -13 12:0000 1100 取反:1111 0011 # 反推 1111 0010 1000 1101
print(10^9) # 3 0000 1010 0000 1001 --------- 0000 0011
print(10^-9) # -3 # -9的补码 1000 1001 1111 0111 # 用-9的补码与10的补码进行抑或运算 0000 1010 1111 0111 --------- 1111 1101 # 把获得的补码还原。反推,将上面的结果-1而后取反,符号位不变 1111 1100 1000 0011
参考:
http://www.runoob.com/python3/python3-basic-operators.html
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
http://www.javashuo.com/article/p-epzgofdx-mc.htmlcode