例:
print 5 >> 4 # Right Shift 右移
print 5 << 1 # Left Shift 左移
print 8 & 5 # Bitwise AND 与
print 9 | 4 # Bitwise OR 或
print 12 ^ 42 # Bitwise XOR 异或
print ~88 # Bitwise NOT 非
0
10
0
13
38
-89
要理解按位运算先理解二进制的运算:在python中ob开头的数为二进制数(#号后为10进制数),逢二进一
print 0b1, #1
print 0b10, #2
print 0b11, #3
print 0b100, #4
print 0b101, #5
print 0b110, #6
print 0b111 #7
print "******"
print 0b1 + 0b11 #4
print 0b11 * 0b11 #9
二进制转十进制
编辑
要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右
1101.01(2)=1*20+0*21+1*22+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25
所以总结起来通用公式为:
abcd.efg(2)=d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3
十进制转二进制
十进制整数转换为二进制整数
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
python使用bin()内置函数将十进制转换为二进制:
print bin(1)
print bin(2)
print bin(3)
print bin(4)
print bin(5)
0b1
0b10
0b11
0b100
0b101
python使用int()内置函数来将二进制转换成十进制,int(x, [base]),其作用是将base进制的数转换为整数(十进制)
print int("1",2) #1
print int("10",2) #2
print int("111",2) #7
print int("0b100",2) #4
print int(bin(5),2) #5
# Print out the decimal equivalent of the binary 11001001.
print int("11001001", 2) #201
Slide to the Left! Slide to the Right!
左移和右移其实是相对于这个数的二进制来说的:
# Left Bit Shift (<<)
0b000001 << 2 == 0b000100 (1 << 2 = 4)
0b000101 << 3 == 0b101000 (5 << 3 = 40)
# Right Bit Shift (>>)
0b0010100 >> 3 == 0b000010 (20 >> 3 = 2)
0b0000010 >> 2 == 0b000000 (2 >> 2 = 0)
这里将0b000001左移两位其实就是将位数向左移动两位。
A BIT of This AND That
按位与其实只需要找到两个数相同位数上的是否为1,为1就留下:
a: 00101010 42
b: 00001111 15
===================
a & b: 00001010 10
这里a和b位数相同且都为1的位有第二位和第四位,往上的位数没有就舍去,之间的位数没有用0填充。
print bin(0b1110 & 0b101)
a: 1110
b: 0101
===========
a & b: 0100
同样的,只有第三位为1,位数不同用0补。
A BIT of This OR That
或运算,只要两个数的相同位数有1,则留下,否则舍去:
a: 00101010 42
b: 00001111 15
================
a | b: 00101111 47
print bin(0b1110 | 0b101)
a: 1110
b: 0101
===============
a | b: 1111
This XOR That?
异或,只要两个数相同位置上的数不同就留下,相同则舍去:0和1不同留,00和11不留
a: 00101010 42
b: 00001111 15
================
a ^ b: 00100101 37
print bin(0b1110 ^ 0b101)
a:1110
b:0101
=============
a ^ b:1011
NOT
取反
首先你要明白的几个知识点:
(1)在计算机里面,负数是以补码存储的
(2)原码求补码:取反,+1
(3)补码求原码:取反,+1
(4)取反操作是在原码上进行的!
实际的计算结果: ~4 = -5, ~-5 = 4
依据上述第四条,我们的解释思路是,确定原码===> 取反
(1) 求~4, 我们用八进制来表示4:
4的原码: 0000 0100
取反得到: 1111 1011, 观察符号,是负数,因为负数以补码存储的,所以问题转化为:
某个数x的补码是1111 1011,求x的值(由补码求原码)
取反: 0000 0100
+1: 0000 0101 = 5, 加上标点符号(负号) 得到结果: -5
(2) 求 ~-5,同理用八进制表示-5:
因为-5是负数,所以它是以5的补码表示的,所以转化为已知5的补码,求对应的原码,然后在取反.
5补码: 0000 0101,
取反: 1111 1010
+1: 1111 1011, 得到原码
取反: 0000 0100 = 4 ,加上标点负号(正号)得到结果:4
参考资料:https://blog.csdn.net/u012559520/article/details/65630436