1. 程式人生 > >java中的位操作

java中的位操作

ble 其他 自動 byte 有符號 cnblogs 運算 編譯 位移操作

之前做項目的時候使用位操作不是很多,今天在刷leetcode上題目的時候用到了位操作,是leetcode中的第29題Divide Two Integers。

一、java的位操作:

位運算表達式由操作數和位運算符組成,實現對整數類型的二進制數進行位運算。位運算符可以分為邏輯運算符(包括~、&、|和^)及移位運算符(包括>>、<<和>>>)。

1)左移位運算符(<<)能將運算符左邊的運算對象向左移動運算符右側指定的位數(在低位補0)。左移一位(在不溢出的情況下)相當於乘以2。

2)“有符號”右移位運算符(>>)則將運算符左邊的運算對象向右移動運算符右側指定的位數。 “有符號”右移位運算符使用了“符號擴展”:若值為正,則在高位插入0;若值為負,則在高位插入1。右移一位相當於除以2。

3)Java也添加了一種“無符號”右移位運算符(>>>),它使用了“零擴展”:無論正負,都在高位插入0。

4)若對char,byte或者short進行移位處理,那麽在移位進行之前,它們會自動轉換成一個int。 只有右側的5個低位才會用到。這樣可防止我們在一個int數裏移動不切實際的位數。 若對一個long值進行處理,最後得到的結果也是long。在leetcode這道題目裏面需要用到的類型是long。

5)在這6種操作符,只有~取反是單目操作符,其它5種都是雙目操作符。

二、java位操作的實際操作:

我們從其他博客裏面看到的位操作的舉例往往都是給一個數字,然後通過syso進行輸出操作。

程序:
public class PlusRightMoving{
    public static void main(String[] args){
           System.out.println("5>>1="+(5>>1));
    }
}
輸出結果:
5>>1=2

但是需要註意的是,如果進行賦值操作和C/C++中是不一樣的。

在C/C++中進行左移和右移操作:

div << 1;
res << 1;

但是在java中進行位移操作需要配合賦值操作:

long div = 1;
long res = 1;
while(div < dived){ div = div << 1; res = res << 1; } if(div != dived){ div = div >> 1; res = res >> 1; }

如果只是像C/C++中進行操作一樣,會不能編譯通過。

三、位操作的一些應用題:

1)判斷奇偶

只要根據最未位是0還是1來決定,為0就是偶數,為1就是奇數。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來判斷a是不是偶數。下面程序將輸出0到100之間的所有偶數。

2)交換兩數

int c = 1, d = 2;
c ^= d;
d ^= c;
c ^= d;
System.out.println(“c=” + c);
System.out.println(“d=” + d);

3)變換符號

如對於-11和11,可以通過下面的變換方法將-11變成11

1111 0101(二進制) –取反-> 0000 1010(二進制) –加1-> 0000 1011(二進制)

同樣可以這樣的將11變成-11

0000 1011(二進制) –取反-> 0000 0100(二進制) –加1-> 1111 0101(二進制)

其他的應用可以參考博客文章:

http://blog.csdn.net/wfzczangpeng/article/details/51819471

其中有很多對java位操作的應用介紹。

java中的位操作