按位运算符

例:

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转化成十进制

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

                https://www.codecademy.com/courses/learn-python/lessons/introduction-to-bitwise-operators/exercises/see-this-is-not-that-hard?action=resume_content_item

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值