標籤:java 位元運算符理解
話題一:異或
先看一段代碼吧:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/6F/wKiom1XP6JbDX80rAABR6TGTePY135.jpg" title="搜狗_2015-08-16_09-34-05.png" alt="wKiom1XP6JbDX80rAABR6TGTePY135.jpg" /> 這段代碼是用來實現a,b交換的。
異或是位元運算符,0^1為1,其他情況都是0,這是一個加法不進位的功能!
這有什麼用呢?
其實通過上面交換的例子,我們已經明白A^B^A將得到B,也就是可以實現資料還原的功能!
|
話題二:%與&
如果有一堆資料,我們想將這些資料通過HASH的方式,放入到桶中。
我們可以將桶進行編號,比如0號,1號,...N號桶。
給我們一個資料,我們要完成這個資料和桶的序號的映射轉化關係,這樣放入和尋找就可以了。
由於對於任何一個非負數A,進行A%B,得到的必然是[0,B-1]區間內,所以我們可以利用%的特性來完成這個轉化關係!
其實,&也可以完成這一過程!而且&是CPU層級的位元運算,會更快些!
要知道A&B,得到的一定是[0,B]區間內,真是神奇!
因為,&其實是一個置0的操作,比如A&B,也就是說將A的二進位中出現0的位置都反映到B對應的位置上,因此A&B是一個變小的過程!
但是,注意到比如B是10,對應二進位是1010,也就是說不論A是什麼,A&B得到的二進位的一號位,三號位必然是0【假設從右至左開始】。那麼A&B將取不到一些數,比如3,意味著3號桶將始終得不到資料!因此如果選擇&,那麼B的二進位一定要是連續的1,不能出現0位。
|
話題三:|
我們知道LINUX檔案的許可權可以分為rwx,也就是用三個二進位位就可以表達了,下面要求設計程式實現給定一個數字完成許可權的判斷。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/6C/wKioL1XP-siQKTd1AAFPYMskMVA268.jpg" title="搜狗_2015-08-16_10-43-59.png" alt="wKioL1XP-siQKTd1AAFPYMskMVA268.jpg" />
在涉及到大量的判斷的時候,我們可以利用& | 這些位操作來達到目標!
|
話題四:>>>和<<
>>>是無符號的向右移動,也就是左邊空缺的補0。 而>> << 都是有符號的移動,空缺時補符號位的。
>>> >> << 這些都是操作二進位序列移動的,可是我們實際開發中用得到嗎?
我們知道,在網路上,發送都是位元組流,比如發送int a = 32;
一個int佔用4個位元組,比如從高到低:B1 B2 B3 B4
對於JAVA而言,將按照從高到低的順序進行發送;那麼顯然我們必須能夠將一個int分解成B1,B2, B3,B4;同時,在接收方必須知道如何將B1 B2 B3 B4組裝成原始的資料!
【不同語言可能發送的位元組順序不一樣,比如C/C++可能發送的就是從低到高】
看一段程式吧:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/71/6F/wKioL1XQUuDDNToHAAHQmQ84foQ137.jpg" title="搜狗_2015-08-16_16-59-14.png" alt="wKioL1XQUuDDNToHAAHQmQ84foQ137.jpg" />
運行結果為:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/6F/wKioL1XQUwKw686QAABz614RB3U260.jpg" title="搜狗_2015-08-16_16-59-48.png" alt="wKioL1XQUwKw686QAABz614RB3U260.jpg" />
|
本文出自 “努力奮鬥” 部落格,請務必保留此出處http://zhangfengzhe.blog.51cto.com/8855103/1685021
Java功底篇系列-03-一些位元運算符你會如何理解?