Python如何高效使用位运算符

Python位运算符

按位运算符是把数字看作二进制来进行计算的,使用正确将会大大优化程序,如进制转化。Python中的按位运算法则如下:

变量 a 为 60,b 为 13,二进制格式如下:

  • a = 0011 1100;
  • b = 0000 1101;
运算符描述实例
&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 ,二进制解释: 0000 1100
\按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1(a | b) 输出结果 61 ,二进制解释: 0011 1101
^按位异或运算符:当两对应的二进位相异时,结果为1(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 , ~x 类似于 -x-1(~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式
<<左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0a << 2 输出结果 240 ,二进制解释: 1111 0000
>>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数a >> 2 输出结果 15 ,二进制解释: 0000 1111
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0

c = a & b;        # 12 = 0000 1100
print ("1 - c 的值为:",c)
 
c = a | b;        # 61 = 0011 1101 
print ("2 - c 的值为:", c)
 
c = a ^ b;        # 49 = 0011 0001
print ("3 - c 的值为:", c)
 
c = ~a;           # -61 = 1100 0011
print ("4 - c 的值为:", c)
 
c = a << 2;       # 240 = 1111 0000
print ("5 - c 的值为:", c)
 
c = a >> 2;       # 15 = 0000 1111
print ("6 - c 的值为:", c)

1)<<按位左移
各二进位全部左移n位,高位丢弃,低位补0
x << n 左移 x 的所有二进制位向左移动n位,移出位删掉,移进的位补零

a. 左移1位相当于乘以2
用途:快速计算一个数乘以2的n次方 (8<<3 等同于8*2^3)
b.左移可能会改变一个数的正负性
2)>>按位右移
各二进位全部右移n位,保持符号位不变
x >> n, x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位, 右移不会改变一个数的符

右移1位相当于除以2
x 右移 n 位就相当于除以2的n次方
用途:

  • 快速计算一个数除以2的n次方 (8>>3 等同于8/2^3)
  • 可以使用右移代替二分查找堆的插入操作

3)使用举例:
使用**>>**右移运算计算一个数的二进制表示:

a = 13            # 13 = 0000 1101 
c = []
for i in range(4):#这里4,因为2^4>13
    b = a >> i &1# 每次右移一位,相当于原数除2取整,和1取&与运算
    c.append(b)
print ("c 的二进制表示为:",c[::-1])
# c 的二进制表示为: [1, 1, 0, 1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值