最近报名了黑马训练营,已经通过基础测试环节。现在已经学习到毕向东老师的JAVA视频第《060-二维数组》章节,感觉进制转换这一块知识值得写一下学习笔记。如果大家感觉有需要改进的地方,敬请指点。本人QQ:1349308479
众所周知,计算机内存中最终都是以二进制来存储和处理数据的,位运算符就是对二进制进行运算的运算符。下面以int型为例用代码来说明十进制转16和8进制的方法:
一、十进制转十六进制
- /*
- 十进制转16进制
- */
- public class ToOct{
- public static void main(String[] args){
- new ToOct(60);
- }
- public ToOct(int num){ //构造函数
- int givenNum = num;
- StringBuffer sb = new StringBuffer(); //存储字符串
- while(num!=0){
- int temp = num & 15; //用&...1111即可取出二进制的后四位
- //下面注意16进制中的大于9的数字要转换成字母
- if(temp <= 9){
- sb.append(temp);
- }else{
- sb.append((char)(temp - 10 + 'A'));
- }
- //右移4位<注意是无符号右移,否则如果num为负数,永远也移不完>
- num = num >>> 4;
- }
- System.out.println(givenNum + "=" + sb.reverse());
- }
- }
复制代码
在命令行调试结果如下:
经过系统提供的计算器来复核计算,确认计算无误。
---------------------------------------------------------------------------------------------------------------------------
下面以简图来表示通过位运算来进行 十进制—>十六进制:
十进制int型60在内存中以32位二进制形式表现如下,数字以外的符号是为了看起来直观,不算做位:
○1
第一次将上面○1的60 &15:(二进制1111就是15)
&
temp值
○2
这样就取出了后60的后四位:1100 = 12 = C,十六进制表现形式主是大写字母C,将其存储在StringBuffer sb对象中。
接下来将60右移4位并存储:
新num值 = 60>>>4:
○3
同理,重复上面第一次取后四位的步骤,将○3式&15,即可取出后四位。并存储在sb对象中。num>>>4之后会变成0,即结束循环。
最后,反向打印sb.reverse();。
二、十进制转八进制
十进制转八进制与十进制转十六进制原理相同,只是取的是二进制的后3位,将上面代码中的&15换成&7,>>>4换成>>>3,并且不需要进行数字与字母的转换。
总结:二进制是计算机数据最终存储的形式,八进制与十六进制都是由二进制演变而来的,所以弄清楚这些进制与二进制的相互转换原理与方法很重要。我想,要成为一名真正的程序员,必需要理解二进制,务必要刨根问底。
|