Python位運(yùn)算

位運(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ù)位。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容