java中的位操作
之前做項(xiàng)目的時(shí)候使用位操作不是很多,今天在刷leetcode上題目的時(shí)候用到了位操作,是leetcode中的第29題Divide Two Integers。
一、java的位操作:
位運(yùn)算表達(dá)式由操作數(shù)和位運(yùn)算符組成,實(shí)現(xiàn)對(duì)整數(shù)類型的二進(jìn)制數(shù)進(jìn)行位運(yùn)算。位運(yùn)算符可以分為邏輯運(yùn)算符(包括~、&、|和^)及移位運(yùn)算符(包括>>、<<和>>>)。
1)左移位運(yùn)算符(<<)能將運(yùn)算符左邊的運(yùn)算對(duì)象向左移動(dòng)運(yùn)算符右側(cè)指定的位數(shù)(在低位補(bǔ)0)。左移一位(在不溢出的情況下)相當(dāng)于乘以2。?
2)“有符號(hào)”右移位運(yùn)算符(>>)則將運(yùn)算符左邊的運(yùn)算對(duì)象向右移動(dòng)運(yùn)算符右側(cè)指定的位數(shù)。 “有符號(hào)”右移位運(yùn)算符使用了“符號(hào)擴(kuò)展”:若值為正,則在高位插入0;若值為負(fù),則在高位插入1。右移一位相當(dāng)于除以2。
3)Java也添加了一種“無符號(hào)”右移位運(yùn)算符(>>>),它使用了“零擴(kuò)展”:無論正負(fù),都在高位插入0。
4)若對(duì)char,byte或者short進(jìn)行移位處理,那么在移位進(jìn)行之前,它們會(huì)自動(dòng)轉(zhuǎn)換成一個(gè)int。 只有右側(cè)的5個(gè)低位才會(huì)用到。這樣可防止我們?cè)谝粋€(gè)int數(shù)里移動(dòng)不切實(shí)際的位數(shù)。 若對(duì)一個(gè)long值進(jìn)行處理,最后得到的結(jié)果也是long。在leetcode這道題目里面需要用到的類型是long。
5)在這6種操作符,只有~取反是單目操作符,其它5種都是雙目操作符。
二、java位操作的實(shí)際操作:
我們從其他博客里面看到的位操作的舉例往往都是給一個(gè)數(shù)字,然后通過syso進(jìn)行輸出操作。
程序: public class PlusRightMoving{public static void main(String[] args){System.out.println("5>>1="+(5>>1));} } 輸出結(jié)果: 5>>1=2但是需要注意的是,如果進(jìn)行賦值操作和C/C++中是不一樣的。
在C/C++中進(jìn)行左移和右移操作:
div << 1; res << 1;但是在java中進(jìn)行位移操作需要配合賦值操作:
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++中進(jìn)行操作一樣,會(huì)不能編譯通過。
三、位操作的一些應(yīng)用題:
1)判斷奇偶
只要根據(jù)最未位是0還是1來決定,為0就是偶數(shù),為1就是奇數(shù)。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來判斷a是不是偶數(shù)。下面程序?qū)⑤敵?到100之間的所有偶數(shù)。
2)交換兩數(shù)
int c = 1, d = 2;?
c ^= d;?
d ^= c;?
c ^= d;?
System.out.println(“c=” + c);?
System.out.println(“d=” + d);
3)變換符號(hào)
?
如對(duì)于-11和11,可以通過下面的變換方法將-11變成11
?
1111 0101(二進(jìn)制) –取反-> 0000 1010(二進(jìn)制) –加1-> 0000 1011(二進(jìn)制)
?
同樣可以這樣的將11變成-11
?
0000 1011(二進(jìn)制) –取反-> 0000 0100(二進(jìn)制) –加1-> 1111 0101(二進(jìn)制)
其他的應(yīng)用可以參考博客文章:
http://blog.csdn.net/wfzczangpeng/article/details/51819471
其中有很多對(duì)java位操作的應(yīng)用介紹。
?
轉(zhuǎn)載于:https://www.cnblogs.com/winterfells/p/7596877.html
總結(jié)
- 上一篇: Linux CentOS服务启动
- 下一篇: 树莓派学习——音频视频播放