涉及知識點:強制類型轉換,移位運算符,十進制轉換十六進制。
十進制數 60 轉換成十六進制過程分析
60的二進制表示:
0000-0000 0000-0000 0000-0000 0011-1100
&0000-0000 0000-0000 0000-0000 0000-1111 //與運算,和15與運算得到60的十六進制的最後一位。
=0000-0000 0000-0000 0000-0000 0000-1100 //即60的十六進制數,最後一位是12,也就是C。
移位運算符:
然後右移四位,移位運算符 “>>” 和 "<<" ,“>>” 運算符用符號位填充高位,"<<" 運算符用0填充低位。
還有一個右移運算符 ">>>" 用 0 填充高位。
本例中使用 ">>>"。
所以60右移四位後爲:
0000-0000 0000-0000 0000-0000 0000-0011
&0000-0000 0000-0000 0000-0000 0000-1111 //繼續和 15 進行與運算。
=0000-0000 0000-0000 0000-0000 0000-0011 //得到3,即60的十六進制是 3C。
強制類型轉換:
12 怎麼轉換成16進制的 'C' 呢?如下
char t = 2 + 'A' ; // int 類型強制轉換爲char類型,前面加char,輸出爲char類型的 'C'。
t = 'C' ;
t = 2 + 'A' ; //無強制轉換,默認輸出 int 類型,char類型轉換爲對應的ASCII碼輸出。
t = 67;
不同數據類型的數據參與運算,數據類型要強制轉換,轉換方向是:
(unsigned)char,(unsigned)short->int->unsigned->long->unsigned long->float->double
合法的類型轉換見圖:
實心箭頭表示無信息丟失的轉換,虛線箭頭表示有精度損失。
代碼分析:
public class DtoH {
public static void main(String[] args) {
toHex(60);
}
public static void toHex(int num) {
for(int x=0; x<8; x++) {
int temp = num & 15; //和 1111(二進制) 進行與運算,得到十六進制的最後一位。
if(temp>9)
System.out.println((char)(temp-10+'A')); //大於9則轉換成十六進制,將10、11、12、13、14、15對應輸出爲 A、B、C、D、E。
else
System.out.println(temp);
num = num >>> 4; //右移四位,繼續與運算。
}
}
}
(char)(temp-10+'A')
就表示強制轉換,12-10+‘A' 轉換成 char 類型 ,結果爲 'C' 。
代碼結果爲
即結果爲 3C