涉及知识点:强制类型转换,移位运算符,十进制转换十六进制。
十进制数 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