Java 中int與byte數組轉換詳解

一、與運算符的理解(&):      java

參加運算的兩個數據,按二進位進行「與」運算。若是兩個相應的二進位都爲1,則該位的結果值爲1,不然爲0。即 0&0=0;0&1=0;1&0=0;1&1=1; 數組

例子:int x = 62255550; y =0xff; spa

           轉二進制:x = 62255550 = 11101101011111000110111110; code

y  = 0xFF = 11111111; ci

 

   11 10110101 11110001 10111110 編譯器

&00 00000000 00000000 11111111 數學

 

   00 00000000 00000000 10111110 io

(從右到左作與運算,不足的補0) 編譯

若是參加&運算的是負數(如-3 & -5),則以補碼形式表示爲二進制數,而後按位進行「與」運算。 table

 

二、移位運算:java移位運算符三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。

--一、 左移運算符

左移運算符<<使指定值的全部位都左移規定的次數。

1)它的通用格式以下所示:

value << num

num 指定要移位值value 移動的位數。

左移的規則只記住一點:丟棄最高位,0補最低位

若是移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。

2)運算規則

按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。

當左移的運算數是int 類型時,每移動1位它的第31位就要被移出而且丟棄;

當左移的運算數是long 類型時,每移動1位它的第63位就要被移出而且丟棄。

當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

3)數學意義

在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方

4)計算過程:

例如:3 <<2(3爲int型)

1)把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,

2)把該數字高位(左側)的兩個零移出,其餘的數字都朝左平移2位,

3)在低位(右側)的兩個空位補零。則獲得的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,

轉換爲十進制是12。

--二、 右移運算符

右移運算符<<使指定值的全部位都右移規定的次數。

1)它的通用格式以下所示:

value >> num

num 指定要移位值value 移動的位數。

右移的規則只記住一點:符號位不變,左邊補上符號位

2)運算規則:

按二進制形式把全部的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1

當右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

例如,若是要移走的值爲負數,每一次右移都在左邊補1,若是要移走的值爲正數,每一次右移都在左邊補0,這叫作符號位擴展(保留符號位)(sign extension ),在進行右移

操做時用來保持負數的符號。

3)數學意義

右移一位至關於除2,右移n位至關於除以2的n次方。

4)計算過程

11 >>2(11爲int型)

1)11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011

2)把低位的最後兩個數字移出,由於該數字是正數,因此在高位補零。

3)最終結果是0000 0000 0000 0000 0000 0000 0000 0010。

轉換爲十進制是2。

35 >> 2(35爲int型)

35轉換爲二進制:0000 0000 0000 0000 0000 0000 0010 0011

把低位的最後兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000

轉換爲十進制: 8

5)在右移時不保留符號的出來

右移後的值與0x0f進行按位與運算,這樣能夠捨棄任何的符號位擴展,以便獲得的值能夠做爲定義數組的下標,從而獲得對應數組元素表明的十六進制字符。

--三、無符號右移

無符號右移運算符>>>

它的通用格式以下所示:

value >>> num

num 指定要移位值value 移動的位數。

無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位

無符號右移運算符>>> 只是對32位和64位的值有意義

 

三、java中:

     1

一個byte 佔一個字節,即8位比特;

    2

一個int 4個字節,即32比特;

   3

java的二進制採用的是補碼形式

 ⑴一個數爲正,則它的原碼、反碼、補碼相同

 一個數爲負,剛符號位爲1,其他各位是對原碼取反,而後整個數加1

由於補碼存在,因此右移運算後要與0xff相與運算

    4

Java中,當咱們要將int 轉換爲byte數組時,一個int就須要長度爲4個字節的數組來存放,其中一次從數組下標爲[0]開始存放int的高位到低位。

   5

Java中的一個byte,其範圍是-128~127的,而Integer.toHexString的參數原本是int,若是不進行&0xff,那麼當一個byte會轉換成int時,對於負數,會作位擴展,舉例來講,一個byte-1(即0xff),會被轉換成int-1(即0xffffffff),那麼轉化出的結果就不是咱們想要的了。

 

而0xff默認是整形,因此,一個byte跟0xff相與會先將那個byte轉化成整形運算,這樣,結果中的高的24個比特就總會被清0,因而結果老是咱們想要的。

 

四、代碼:

/**
	 * int到byte[]
	 * @param i
	 * @return
	 */
	public static byte[] intToByteArray(int i) {   
		  byte[] result = new byte[4];   
		  //由高位到低位
		  result[0] = (byte)((i >> 24) & 0xFF);
		  result[1] = (byte)((i >> 16) & 0xFF);
		  result[2] = (byte)((i >> 8) & 0xFF); 
		  result[3] = (byte)(i & 0xFF);
		  return result;
		}

		/**
		 * byte[]轉int
		 * @param bytes
		 * @return
		 */
		public static int byteArrayToInt(byte[] bytes) {
		       int value= 0;
		       //由高位到低位
		       for (int i = 0; i < 4; i++) {
		           int shift= (4 - 1 - i) * 8;
		           value +=(bytes[i] & 0x000000FF) << shift;//往高位遊
		       }
		       return value;
		 }
相關文章
相關標籤/搜索