python 位運算

主要介紹

  1. 簡介
  2. 位運算符
  3. 相關問題

簡介

  • 程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操做 百度百科
  • 按位運算就把數字轉換爲機器語言——二進制的數字來運算的一種運算形式 Freewind的技術專欄

python 中的位運算符

  • 按位或預算 ( | )
    1|1=1  0|1=1  1|0=1  0|0 = 0
    即參加運算的兩個對象只要有一個爲1,其值爲1。
    4|3= 7  (轉化爲二進制至關於 100 | 011  = 111 )
    複製代碼
  • 按位與運算 ( & )
    1&1=1    0&1=0     0&0=0     1&0=0
    即:兩位同時爲「1」,結果才爲「1」,不然爲0    
    4&3= 0   (轉化爲二進制至關於 100 & 011 = 000 )
    複製代碼
  • 異或運算 ( ^ )
    1^1=0     0^1=1     1^0=1     0^0=0
    即:兩位相同爲「0」,不一樣才爲「1」  
    4^3 = 7  (轉化爲二進制至關於 100 ^ 011 = 111)
    異或的幾條性質:
    一、交換律  a^b = b^a
    二、結合律  a^b^c = a^(b^c)
    三、對於任何數x,都有x^x=0,x^0=x
    四、自反性:  a^b^b=a^0=a;
    複製代碼
  • 按位翻轉 ( ~ )
    將二進制數+1以後乘以-1,x的按位翻轉是-(x+1)
    數字 1 在計算機中表示是由計算機字符編碼決定的[1]
    utf-8,對萬國碼進行按類壓縮,優化存放空間
    數字1:00000001,8位
    漢字:3個字節
    ~1 = ~(0000 0001) 至關於 (1111 1110) 可能我會覺得 這個數字是至關大的一個數了,可是用python解釋器打印
    倒是-2 緣由是由於計算機在存儲數值中有一個符號位 正數的符號位是0 負數的符號位爲1 而計算機中有涉及源碼 反碼補碼中
    咱們通常用補碼錶示負數,因此,對-2絕對值原碼取反加1,獲得1111 1101+1 = 1111 1110 反過來就是 1
    複製代碼
  • 左移運算符( << )
    1 << 1 = 2  2<< 1 = 4
    左移1位後a = a *2
    複製代碼
  • 右移運算符(>>)
    1 >> 1 = 0  2 >> 1 = 1
    左移1位後a = a / 2
    複製代碼

相關問題

  • 進制轉換
    def conver(n):
            """ 10進制轉2進制 """
            if n==0:
                return 0
            temp = []
            while n:
                temp.append(n%2)
                n = n>>1
            temp.reverse()
            return "".join([str(x) for x in temp])
        def reconver(str1):
            """ 2進制轉10進制 """
            temp = [int(x)for x in list(str1)]
            temp.reverse()
            sum = 0
            for i in range(0,len(temp)):
                sum += pow(2,i) * temp[i]
            return sum
    複製代碼
  • 判斷奇偶性
    def is_odd(n):
        if n&1 == 1:
            print("奇數")
        else:
            print("偶數")
    複製代碼
  • 整數n的二進制中1的個數
    5 ( 101 )
    5 & 4 (101 & 100 = 100 ) 
    4 & 3 (100 & 011 = 000)
    >>>>> 2 
    def totle_num(n):
        """ 整數n的二進制中1的個數 n&(n-1)這個式子什麼做用?把n的二進制數字中最右邊的1變爲0 """
        count = 0
        while n:
            count+=1
            n = n&(n-1)
        print(count)
    複製代碼
  • 找出那個只出現了一次的元素
    def singleNumber(nums):
        """ [0,1,2,0,1,2,3] 給定一個非空整數列表,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。leetcode 136 """
        ret = 0
        for x  in nums:
            ret = ret ^x
        return ret
    複製代碼
  • 沒有出如今序列中的那個數
    1. 給定一個包含 0..n 中 n 個數的列表,找出 0 .. n 中沒有出如今序列中的那個數。 leetcode 268
        [1,3,0] 2
        0^1^2^3^1^3^0    2
        ret = 0
        for i in range(0,n+1)
            ret ^= i
        
        for i in range(0,len(nums)):
            ret ^= nums[i]
        
        return ret
        
        2. 1-n 放在含有 n+1 個元素的列表中,只有惟一的一個元素值重複,其它均只出現一次.
           每一個列表元素只能訪問一次,設計一個算法,將它找出來;不用輔助存儲空間。 進階版 leetcode 287
        [1,2,2,3] 2 
        0^1^2^3^1^2^2^3 = 2
    複製代碼
  • 一種整數數據壓縮存儲的算法實現
    def readVarint(trans):
    result = 0 
    shift = 0 
    while True:
        x = trans.readAll(1)    // 讀取下一個字符
        byte = ord(x)              // 轉成整數表示
        result |= (byte & 0x7f) << shift // 將該字節去掉最高位放在已有結果的左側
    if byte >> 7 == 0:       // 若是該字節最高位是0,結束
        return result
    shift += 7
    複製代碼
相關文章
相關標籤/搜索