Python位运算

位运算直接在二进制层面操作,因此效率相对来说比较高。有时候也有精妙的运用。

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。当然是忽略小数位。

你可能感兴趣的:(Python位运算)