Java 中int與byte數組轉換

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

參加運算的兩個數據,按二進位進行“與”運算。如果兩個相應的二進位都爲1,則該位的結果值爲1,否則爲0。即 0&0=0;0&1=0;1&0=0;1&1=1;

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

           轉二進制:x = 62255550 = 11101101011111000110111110;

y  = 0xFF = 11111111;

 

   11 10110101 11110001 10111110

&00 00000000 00000000 11111111

 

   00 00000000 00000000 10111110

(從右到左做與運算,不足的補0)

如果參加&運算的是負數(如-3 & -5),則以補碼形式表示爲二進制數,然後按位進行“與”運算。

 

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

--1、 左移運算符

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

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。

--2、 右移運算符

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

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進行按位與運算,這樣可以捨棄任何的符號位擴展,以便得到的值可以作爲定義數組的下標,從而得到對應數組元素代表的十六進制字符。

--3、無符號右移

無符號右移運算符>>>

它的通用格式如下所示:

value >>> num

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

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

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

 

3、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,於是結果總是我們想要的。

 

4、代碼:

/**
	 * 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;
		 }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章