(轉)位操作是程序設計中對位模式或二進制數的一元和二元操作. 在許多古老的微處理器上, 位運算比加減運算略快, 通常位運算比乘除法運算要快很多. 在現代架構中, 情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算).
簡單來說,按位運算就把數字轉換為機器語言——二進制的數字來運算的一種運算形式。在計算機系統中,數值一律用補碼來表示(存儲)。
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
-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.
方法: 對位相加,特別要注意的是不進位.
-3^4
解法: -3的補碼是11111101,4的補碼是100 (也即00000100), 1111 1101^0000 0100=1111 1001,補碼1111 1001轉為原碼是1000 0111,即十進制的-7.
~3