黑马程序员技术交流社区
标题:
利用位运算进行 十进制转16进制 十进制转8进制
[打印本页]
作者:
行意天下
时间:
2015-1-16 21:29
标题:
利用位运算进行 十进制转16进制 十进制转8进制
最近报名了黑马训练营,已经通过基础测试环节。现在已经学习到毕向东老师的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,并且不需要进行数字与字母的转换。
总结:二进制是计算机数据最终存储的形式,八进制与十六进制都是由二进制演变而来的,所以弄清楚这些进制与二进制的相互转换原理与方法很重要。我想,要成为一名真正的程序员,必需要理解二进制,务必要刨根问底。
作者:
行意天下
时间:
2015-1-16 21:37
初次发贴子,图片没有显示出来,还请多多包涵啊。
作者:
行意天下
时间:
2015-1-20 18:22
:),超哥,多谢啊!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2