最近在作一個有關TCP/TP通訊的消息解析,涉及到了這方面的轉換,記錄一下。java
首先,若是是在網絡傳輸、消息解析的狀況下,要注意一下網絡傳送使用的是大端仍是小端模式,這影響到咱們的高低位的傳輸順序。數組
WORD: 無符號雙字節整形(字,16位)網絡
DWORD:無符號四字節整形 (雙字,32位)spa
Byte:8位.net
採用Java位操做來實現(採用大端方式,故先傳遞高位,則接收方低位爲高)code
//轉換DWORD到整型數據 private int DWORDtoInt(byte[] sourceArr,int start){ //len=4,inArr爲獲取到的4位Byte數組 byte[] intArr=spiltByteArr(sourceArr,start,4); return intArr[0]<<24|intArr[1]<<16|intArr[2]<<8|intArr[3]; } //轉換WORD到整形數據 private int WORDtoInt(byte[] sourceArr,int start){ //len=2,intArr爲獲取到的2爲Byte數組 byte[] intArr=spiltByteArr(sourceArr,start,2); return intArr[0]<<8|intArr[1]; }
說到位運算,天然說的所有都是二進制運算,相信你們都比較熟悉,但我仍是要說明(囉嗦)一下,java裏int型是4個字節,即32位,用二進制表示java裏的1就是000……0001,這些都是有符號的數,也就是最高位表明符號位,也就是32位能表示的最大整數是2的32次方-1.下面舉得栗子,我不會本身爲難本身,搞十幾位數,全部都是二位數,全部只用一個字節,且最高依然表明符號位。blog
與運算符就至關於&&,不一樣的是,這是按位對比,好比8&9,用十進制的眼光去看簡直就瞎了,8&9其實作的運算就是00001000&00001001,而後看到當且僅當兩個對應的位置都是1,結果纔是1,不然結果爲0,那麼結果就是00001000,也就是8.
那麼,這個運算有什麼卵用麼?答案是固然有啦,好比,咱們如今都是用int去作標誌位,好比1表明正常,0表明異常,那若是咱們用二進制來作的話,不就很爽了麼,0001表明正常0010表明異常,0100表明XXX,是否是想一想都有點小激動·····get
或運算符就至關於||, 固然也是按位去或的,當且僅當兩個對應的位置都是0,結果纔是0,不然結果是1,那麼8|9就是00001000|00001001,結果就是00001001=9。至於這個有什麼用,我就不贅述了,有規則就會有用,就這麼簡單·····博客
非運算符是又得講一下的,理解起來很容易的,就是按位取反,好比~8對吧,那就是00001000按位取反結果是11110111.前面說了,這是有符號數,也就是最高位表明符號位,也就是~8的結果是一個負數,那麼人類第一反應是-8,但結果卻不是,那這裏簡單解析一下,負數的二進制表示方式跟正數不同,負數有一個反碼和補碼的概念,這麼理解呢?就說-8吧,用二進制表示-8是:11111000,-10的二進制是:11110110.
首先-8的絕對值8的二進制是00001000, 求其反碼就是11110111,補碼(+1)是11111000。那麼上面~8的結果11110111是多少呢?咱們算一下,先-1獲得11110110,而後取反:00001001,獲得9,那麼~8==9?不是的,是結果的絕對值,由於是負數,因此是-9.這個結果你們能夠去驗證下~~~class
異或運算是:當運算符兩邊不一樣的時候結果爲1,兩邊相同的時候結果爲0 這就是傳說中的同性相殺,異性相吻。舉個例子就是:8^6=1000^0110=1110=14
位移運算符咱們能夠簡單的理解爲乘除法,像左移是除法,向右移是乘法。這個符號位是不移動的,注意下。8>>2你們不要理解爲8/2,位移兩位就是除以2的2次方也就是8/4.這裏注意9>>1的結果是4,即最低位的1會移沒了··固然了<<若是結果超過了最大整數能表示的範文,那就·····你懂的。
這個運算符跟>>差很少,不一樣點是,它移動後高位補0,。好像>>位移後高位也是補0啊,是的,但符號位不移動,而>>>tm符號位都移動了,就是負數一移就正了·····