位运算直接在二进制层面操作,因此效率相对来说比较高。有时候也有精妙的运用。
0、基本说明
1) 位运算是针对整型数据进行的运算;
2)是对数的二进制位
的直接运算和操作;
一、位运算符
- &:按“位”与,用于两个数之间,当对应二进制位都为1时,对应位结果为1,否则为0。
# 当相同二进制位都为1时,结果为1
a, b = 2, 3
a & b
>>> 2 # 2与3,按位与,结果为2
2二进制:0010
3二进制:0011
&之后:0010 # 即结果十进制表示为2
- |:按“位”或,当对应二进制位其中有1个为1时,对应位结果为1,否则为0。
# 当相同二进制位其中有一个为1时,即为1
a, b = 2, 3
a | b
>>> 3
2二进制:0010
3二进制:0011
&之后:0011 # 即结果十进制表示为3
- ^:按“位”异或,当对应二进制位不同时,对应位结果为1,否则为0。
# 当相同二进制位b相异时,即为1
a, b = 2, 3
a ^ b
>>> 1
2二进制:0010
3二进制:0011
&之后:0001 # 即结果十进制表示为1
- ~:按“位”否,用于一个数,对每一位二进制位取反,1 -> 0, 0 -> 1。
a = 2
~a
>>> -3
这里为啥是 -3,跟计算机储存2这个值的方式有关。
- >> :向右移指定位数,对一个数使用,将所有二进制位都向右移几位。
a = 3
a >> 1
>>> 1
a二进制:0011
a >> 1:0001 # 1
也相当于将原数 整除以 2*n
a >> 2,即 a // 4
- <<:向左移指定位数,对一个数使用,将所有二进制位都向左移几位,后面补0。
a = 3
a << 1
>>> 6
a二进制:0011
a << 1:0110 # 6
二、一些运用
- 判断一个数的奇偶性
奇数二进制最后一位都为1,偶数最后一位为0。
因此,可以通过与 1进行 &
运算,来判断一个数的奇偶性:如果 a & 1 = 0,则a为偶数;如果a & 1 = 1,则a为奇数。
- 左移一位相当于乘以2,右移一位相当于除以2(整除)
def binary_search(ordered_list, item):
'''
:param ordered_list: 有序列表
:param item: 要查找的元素
:return: item在list中的索引,若不在list中返回None
'''
low, high = 0, len(ordered_list) - 1
while low <= high:
mid_point = (low + high) >> 1
if ordered_list[mid_point] == item:
return mid_point
elif ordered_list[mid_point] < item:
low = mid_point + 1
elif ordered_list[mid_point] > item:
high = mid_point - 1
return None
二进制位的左移和右移,可以类比十进制的小数点左移和右移。区别是分别 *2 或是 * 10;除以2或是除以10。当然是忽略小数位。