Python語言中的按位運算


(轉)位操作是程序設計中對位模式二進制數的一元和二元操作. 在許多古老的微處理器上, 位運算比加減運算略快, 通常位運算比乘除法運算要快很多. 在現代架構中, 情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算).

   簡單來說,按位運算就把數字轉換為機器語言——二進制的數字來運算的一種運算形式在計算機系統中,數值一律用補碼來表示(存儲)。

      Python中的按位運算符有:左移運算符(<<),右移運算符(>>),按位與(&),按位或(|),按位翻轉(~)。這些運算符中只有按位翻轉運算符是單目運算符,其他的都是雙目運算符。

      按位與    &

           舉例: 

                  3&5                        

                  解法:3的二進制補碼是 11,  5的是101, 3&5也就是011&101,先看百位(其實不是百位,這樣做只是便於理解) 一個0一個1,根據(1&1=1,1&0=0,0&0=0,0&1=0)可知百位應該是0,同樣十位上的數字1&0=0,個位上的數字1&1=1,因此最后的結果是1.(這之后本來應該還有一步,因為我們現在得到的數值只是所求答案的補碼,但是因為正數的補碼即是它本身,所以就省略了。不過,下面的例子就不能省略最后這一步了).    

                  -1&-2

                   解法:-1的補碼是11111111,  -2的補碼是11111110, 11111111&11111110得到的結果是:11111110,這個是補碼,再轉化位原碼為100000010 (負數轉換位原碼的方法是減一取反),最后轉換為十進制是 -2.

                  -2&6   

                   解法:-2的補碼是11111110,  6的補碼是110,   11111110&110,也就是11111110&00000110(這樣寫的目的是讓初學者能夠更好理解按位運算),按照上面的方法得到的結果是:110,轉化位十進制就是6.

          小技巧:利用按位與可以將任意二進制數的最后一位變為0,即就是X&0.

 

       

       按位並    |

 

 

          舉例: 

                 4|7

                 解法:按位並的計算規律和按位與的很相似,只不過換了邏輯運算符,並的規律是: 1|1=1 ,1 |0=1, 0|0=0.   4|7轉換位二進制就是:100|111=111.  二進制111即為十進制的7.

         小技巧:利用按位並可以將任意二進制數的最后一位變為1,即就是X|1.

        

         按位異或    ^

          方法:  對位相加,別要注意的是不進位.      

          舉例: 

                   2^5

                   解法:10^101=111,二進制111得到十進制的結果是7.
                   

                   1^1

                   解法:1+1=0.(本來二進制1+1=10,但不能進位,所以結果是0) 

                   -3^4

                  

                    解法: -3的補碼是11111101,4的補碼是100 (也即00000100), 1111 1101^0000 0100=1111 1001,補碼1111 1001轉為原碼是1000 0111,即十進制的-7.

 
         按位翻轉  ~   
         
          方法:   將二進制數+1之后乘以-1,x的按位翻轉是-(x+1) . 注意,按位運算符是單目運算符.  -9 ,  1+~4是正確的,5~3就不對了.
      這是更快捷的按位翻轉算法,也可以按部就班每位按位取反(包括符號位),最后如果是負數再轉為原碼 
          舉例:

                  ~3

                  解法:3的二進制是11, -(11+1)=-100B=-4D. (注:B和D分別表示二進制和十進制).

                  ~-2

                   解法:   -  (-10+1)  =1 【即(b)10 - 1 = 01】  【此方法不涉及補碼】
     或者:-2在計算機中存儲為補碼:1111 1110,按位取反得~1111 1110 = 0000 0001即為1
 

       左移運算符  << 

           

           方法:    X<<N 將一個數字X所對應的二進制數向左移動N位.

           舉例:

                 3<<2
   
                 解法:11向左移動兩位變為1100,即12 .
 

        右移動運算符  >>

             

           方法:    X>>N 將一個數字X所對應的二進制數向右移動N位.

             

           舉例:

 
         
                       3>>2
   
                       解法:11向右移動兩位變為0.
 
                        10>>1
          
                        解法:10的二進制是1010,向右邊移動一位是101,即5.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM