1. 程式人生 > >程式中位運算的妙用

程式中位運算的妙用

       程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算說穿了,就是直接對整數在記憶體中的二進位制位運算。比如,and運算本來是一個邏輯運算子,但整數與整數之間也可以進行and運算。舉個例子,6的二進位制110,11的二進位制是1011,那麼6 and 11的結果就是2(0010),它是二進位制對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理,同1為1,其餘全為0)。位運算相較於其他計算符來講,由於是直接使用計算機的方式來處理資料,無疑會被計算機更快的識別處理,提高程式執行速度。

1 ~
2 <<、>>
3 &
4 ^
5 |
6 &=、^=、|=、<<=、>>=
以上是位運算的優先順序和種類。

下面舉一些位運算的小例子:
1.&的妙用

 if((n&1) == 1)  
 {  
      System.out.println("n為奇數");     
 }
n&1是n和1做"按位與"運算,1的二進位制只有末位是1,所以n&1就是隻保留n的末位(二進位制).n&1就表示了n的奇偶性.n若為偶數,其二進位制表示最後一位一定為0,所以與1相與得0,而奇數則相反,其二進位制最後一位一定為1所以與1相與得1,這樣就可以判斷一個數的奇偶性,而不是使用%2的方法來判斷。

2.<< 和 >>的秒用

public class exercise{
    public static void main(String[] args) {
        int i=4;
        int j=6;
        System.out.println(i<<1);
        System.out.println(j>>1);
    }
}
向左移相當於一個數乘2,向右移相當於除2,例如上面的4(省略到只有四位0100),向左移一位,就變成了8(1000),而6(0110),向右移一位則變為了3(0011)。

3^(異或)的妙用

public class exercise3 {
	public static void main(String[] args) {
		int i=-4;
		int j=6;
		boolean isNeg = (i^j)>>>31 == 0;
		if(isNeg)
		{			
			System.out.println("i,j同號");
		}
		else
		{
			System.out.println("i,j異號");
		}
	}
}
異或的規則是同0異1,通常和>>>(無符號右移)搭配使用,>>表示有符號右移,如果該數為正,則高位補0,若為負數,則高位補1;>>>表示無符號右移,也叫邏輯右移,即若該數為正,則高位補0,而若該數為負數,則右移後高位同樣補0。int型別32位,無符號右移31位則只剩下符號位,進行異或便可知道兩數是不是同號。而且這樣寫最大的好處是不需要考慮數值越界的問題。

大概比較常用的有這幾個,以後再進行補充。