【轉】Java中十六進位轉換 Integer.toHexString()__Java

來源:互聯網
上載者:User

  Java中十六進位轉換 Integer.toHexString() 關鍵字: integer.tohexstring

為了顯示一個byte型的單位元組十六進位(兩位十六進位表示)的編碼,請使用:

Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6)

 byteVar & 0x000000FF的作用是,如果byteVar 是負數,則會清除前面24個零,正的byte整型不受影響。(...) | 0xFFFFFF00的作用是,如果byteVar 是正數,則置前24位為一,這樣toHexString輸出一個小於等於15的byte整型的十六進位時,倒數第二位為零且不會被丟棄,這樣可以通過substring方法進行截取最後兩位即可。

  Java代碼 import junit.framework.TestCase; public class Hex extends TestCase { public void testPositiveIntToHex() { //如果正數小於15時,只輸入一位,而不是按我們想像的兩位標準十六進位輸出顯示的,後面解決這個問題 System.out.println(Integer.toHexString(2));//2 System.out.println(Integer.toHexString(15));//f System.out.println(Integer.toHexString(16));//10 System.out.println(Integer.valueOf("F", 16));//16 } /* * Integer.valueOf()實質上調用的是Integer.parseInt()來完成的,所以 * Integer.parseInt()與Integer.valueOf()功能是一樣的,只是傳回值不 * 一樣而已 */ public void testNegativeIntToHex() { //負整數時,前面輸入了多餘的 FF ,沒有去掉前面多餘的 FF,按並雙位元組形式輸出 System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE //實質上0xFF會像轉換成0x000000FF後再進行位元運算 System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE //注,FE輸出時不會為-2,因為此時不會把FE看成負數,valueOf會把所有數字串看成正的 System.out.println(Integer.valueOf("FE", 16));//254 //如果要輸出-2,只能按以下形式輸出 System.out.println(Integer.valueOf("-2", 16));//-2 //所以要把 FE 看成負的話,只能在前面加上負號,但是這裡輸出還不是-2, //而是先計算Integer.valueOf("FE", 16),再在結果前加上負 System.out.println(Integer.valueOf("-FE", 16));//-254 /* 所以如果要輸入某個負數,我們只能先求出該數的絕對值的原碼十六進位,再在前面加上負號, * 例如求表示-128,則先對絕對值128求十六進位 80,再在前面加上負號 -80 */ System.out.println(Integer.valueOf("-80", 16));//-128 /* 為什麼說valueOf把所有數字串看成正的呢。請看下面三行代碼,因為最大正數為2147483647, * 如果再 在7fffffff基礎上加上一個一,運行肯定會出錯誤(這與直接輸出0x80000000不一樣), * 那麼就可以證明 */ System.out.println(Integer.valueOf("7fffffff", 16));//2147483647 //此句運行時會報錯,因為最大正數為7fffffff,但如 -80000000 卻又可以運行,因為沒超出整數範圍 //System.out.println(Integer.valueOf("80000000", 16));//不能運行,已注掉 System.out.println(Integer.valueOf("-80000000", 16));//-2147483648 /* 注,輸出時不是負數,而是正,因為0xFE只有8位,而整數是32位,所以以int形式出現時前 * 面會自動補24個零,第一位是零,所以最後是正數 */ System.out.println(0xFE);//254 System.out.println(-0xFE);//-254 //但0x80000000已滿,無需補,第一位為一,所以最後為負數 System.out.println(0x80000000);//-2147483648 } public void testNegativeIntToBin() { System.out.println(Integer.toBinaryString(-2));//11111111111111111111111111111110 //實質上0xFF會像轉換成0x000000FF後再進行位元運算 System.out.println(Integer.toBinaryString(-2 & 0xFF));//11111110 System.out.println(Integer.toBinaryString(-2 & 0x000000FF));//11111110 //與上面十六進位是一樣的 System.out.println(Integer.valueOf("1111111111111111111111111111111", 2));//2147483647 //下面語句運行會出錯,已注掉 //System.out.println(Integer.valueOf("10000000000000000000000000000000", 2)); System.out.println(Integer.valueOf("-10000000000000000000000000000000", 2));//-2147483648 System.out.println(Integer.valueOf("11111110", 2));//254 System.out.println(Integer.valueOf("-11111110", 2));//-254 /* 注,Java中沒有直接使用二進位表示一個數(目前只支援八與十六進位直接標記法),下面其實是一個 * 八進位的數與十進位的數 */ System.out.println(010);//8 System.out.println(10);//10 } public void testByteToHex() { byte negativeByte = -2; byte positiveByte = 2; /* toHexString方法類型為int型,所以轉Hex前參數會提升成整型後再進行轉換,過程如下: * 10000010(原碼)->11111110(補碼)->11111111 11111111 11111111 11111110(提升) * ->FFFFFFFE(轉Hex進位輸出) */ System.out.println(Integer.toHexString(negativeByte).toUpperCase());// FFFFFFFE /* 第一步把-2轉成整型: * 10000010(原碼)->11111110(補碼)->11111111 11111111 11111111 11111110(轉整型) * 第二步把 0xFF 前補24個零: * 00000000 00000000 00000000 11111111 * 第三步:把第一二步結果進行與位元運算: * 00000000 00000000 00000000 11111110 * 最後一步:轉十六進位結果為 FE */ System.out.println(Integer.toHexString(negativeByte & 0xFF).toUpperCase());// FE //另一種轉換,可以針對負數與正數的byte都可以以完整的單位元組輸出 System.out.println(Integer.toHexString((negativeByte & 0x000000ff) | 0xffffff00) .substring(6).toUpperCase());//FE System.out.println(Integer.toHexString((positiveByte & 0x000000ff) | 0xffffff00) .substring(6).toUpperCase());//02 } /** * 位元運算與算術運行中的型別提升機制是一樣的 */ public void testBiteMathematical() { System.out.println(0x8000000000000000L);//-9223372036854775808 System.out.println((int) 0x8000000000000000L);//0 System.out.println(0x8000000000000010L);//-9223372036854775792 System.out.println(0x80000000);//-2147483648 System.out.println(0x80000010);//-2147483632 //0x00000010提升成長整型,最後結果為長整型0x8000000000000010L System.out.println(0x00000010 | 0x8000000000000000L);//-9223372036854775792 //0x0010提升成整形,最後結果為整型0x80000010 System.out.println(0x0010 | 0x80000000);//-2147483632 } }  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.