無論說是在哪一門計算機語言,位操作運算對于計算機來說肯定是最高效的,因為計算機的底層是按就是二進制,而位操作就是為了節省開銷,加快程序的執行速度,以及真正的實現對數的二進制操作。
使用位操作,很多代碼看起來會很簡潔,并且執行速度也會隨之提高。在大多數編程語言中都會有 << 和 >>
這兩個符號向左的就是左移,反之則是右移這個符號的左邊就是需要操作的數,而右邊就代表了對這個數移動多少位。
1.具體位操作
- 左移( << ):
左移幾位就是將這個數再乘以2的幾次方,例如說 4 << 2 其結果就是16,也就是將這個數化作為2進制的數然后向左移動兩位,最右邊的空位就補0. - 右移( >> ):
右移就剛好相反,但是也不是完全一樣,他是向右移動 n 位,如果說這個數本來就是正的,那么和左移剛好相反就直接除以 2 的 n 次方位,但是如果是負數的話在這個數向右移動 n 位后我們在前面的空位補的是 0 。也就是右移的話是與數相關的問題。右移一個很明顯的應用就是在二分法的時候我們就可以直接右移一位,顯然速度會提高。 - 超級右移( >>> ):
剛剛說了右移其實還是需要按照情況來的,有時候就不一定是正數,我們就可能補 1 ,但是我們期望結果就是這個數除以 2 的 n 次方,我們就可以使用這個無視正負號的右移操作 >>> ,也就是說他是在任何情況下都是給最高位添加 0 。 - 與操作( & ):
與操作就是把兩個數轉化為二進制的數,然后再把這兩個數,從最低位每位對其,同 1 結果為 1 否則全為 0。 - 或操作( | ):
操作同上只是這個是同 0 為 0,其他都是1。 - 取反操作( ~ ):
二進制的0 變 1 , 1 變 0。 - 異或( ^ ):
異或有一條很重要的性質,用的非常多就是一個數異或同一個數兩次結果還是那個數。
上面的與或操作會發現他們有單符號的還有雙符號的,不要搞混了單符號的不僅僅就是位操作,他們還是邏輯操作,而雙符號的僅僅就是邏輯操作。并且他們有區別例如 & 和 && 當他們都作為邏輯操作的,前者就是對一個表達式一直判斷完畢才會出現他的值,而后者則是判斷一半如果知道為假或真他就不再判斷了,這也就是我們看到的大多數的 if 判斷中是用的雙與,而非單與。
2.實際應用:
- 第一個就是兩個數交換,這個一般有三種方式:
第一個:臨時變量
int i=3,j=8,temp=0;
temp=i;
i=j;
j=temp;
第二個:使用加減法
int i=3,j=8;
i=j+i;
j=i-j;
i=i-j;
第三個:位操作
int i=3,j=8;
i=i^j;
j=i^j;
i=i^j;
這個地方就是用了異或的重要性質
- 第二個就是進制轉換了:
基本思路就是先把數轉為二進制的數,然后如果要 16 進制那么就4位取,8進制3位取,但是又怎么取這個4位或者3位呢,這里與操作就能派上用場取四位我們可以直接與上 15 ,三位就是 7 了,例如:
int num=60;
int n1=num & 15;
int tmp=num >>> 4;
int n2=tmp & 15;
System.out.println("n1: "+n1+" n2 "+n2);