位運(yùn)算直接在二進(jìn)制層面操作,因此效率相對(duì)來(lái)說(shuō)比較高。有時(shí)候也有精妙的運(yùn)用。
0、基本說(shuō)明
1) 位運(yùn)算是針對(duì)整型數(shù)據(jù)進(jìn)行的運(yùn)算;
2)是對(duì)數(shù)的二進(jìn)制位的直接運(yùn)算和操作;
一、位運(yùn)算符
- &:按“位”與,用于兩個(gè)數(shù)之間,當(dāng)對(duì)應(yīng)二進(jìn)制位都為1時(shí),對(duì)應(yīng)位結(jié)果為1,否則為0。
# 當(dāng)相同二進(jìn)制位都為1時(shí),結(jié)果為1
a, b = 2, 3
a & b
>>> 2 # 2與3,按位與,結(jié)果為2
2二進(jìn)制:0010
3二進(jìn)制:0011
&之后:0010 # 即結(jié)果十進(jìn)制表示為2
- |:按“位”或,當(dāng)對(duì)應(yīng)二進(jìn)制位其中有1個(gè)為1時(shí),對(duì)應(yīng)位結(jié)果為1,否則為0。
# 當(dāng)相同二進(jìn)制位其中有一個(gè)為1時(shí),即為1
a, b = 2, 3
a | b
>>> 3
2二進(jìn)制:0010
3二進(jìn)制:0011
&之后:0011 # 即結(jié)果十進(jìn)制表示為3
- ^:按“位”異或,當(dāng)對(duì)應(yīng)二進(jìn)制位不同時(shí),對(duì)應(yīng)位結(jié)果為1,否則為0。
# 當(dāng)相同二進(jìn)制位b相異時(shí),即為1
a, b = 2, 3
a ^ b
>>> 1
2二進(jìn)制:0010
3二進(jìn)制:0011
&之后:0001 # 即結(jié)果十進(jìn)制表示為1
- ~:按“位”否,用于一個(gè)數(shù),對(duì)每一位二進(jìn)制位取反,1 -> 0, 0 -> 1。
a = 2
~a
>>> -3
這里為啥是 -3,跟計(jì)算機(jī)儲(chǔ)存2這個(gè)值的方式有關(guān)。
- >> :向右移指定位數(shù),對(duì)一個(gè)數(shù)使用,將所有二進(jìn)制位都向右移幾位。
a = 3
a >> 1
>>> 1
a二進(jìn)制:0011
a >> 1:0001 # 1
也相當(dāng)于將原數(shù) 整除以 2*n
a >> 2,即 a // 4
- <<:向左移指定位數(shù),對(duì)一個(gè)數(shù)使用,將所有二進(jìn)制位都向左移幾位,后面補(bǔ)0。
a = 3
a << 1
>>> 6
a二進(jìn)制:0011
a << 1:0110 # 6
二、一些運(yùn)用
- 判斷一個(gè)數(shù)的奇偶性
奇數(shù)二進(jìn)制最后一位都為1,偶數(shù)最后一位為0。
因此,可以通過(guò)與 1進(jìn)行 &運(yùn)算,來(lái)判斷一個(gè)數(shù)的奇偶性:如果 a & 1 = 0,則a為偶數(shù);如果a & 1 = 1,則a為奇數(shù)。
- 左移一位相當(dāng)于乘以2,右移一位相當(dāng)于除以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
二進(jìn)制位的左移和右移,可以類(lèi)比十進(jìn)制的小數(shù)點(diǎn)左移和右移。區(qū)別是分別 *2 或是 * 10;除以2或是除以10。當(dāng)然是忽略小數(shù)位。