黑马程序员技术交流社区

标题: 利用位运算进行 十进制转16进制 十进制转8进制 [打印本页]

作者: 行意天下    时间: 2015-1-16 21:29
标题: 利用位运算进行 十进制转16进制 十进制转8进制
最近报名了黑马训练营,已经通过基础测试环节。现在已经学习到毕向东老师的JAVA视频第《060-二维数组》章节,感觉进制转换这一块知识值得写一下学习笔记。如果大家感觉有需要改进的地方,敬请指点。本人QQ:1349308479
众所周知,计算机内存中最终都是以二进制来存储和处理数据的,位运算符就是对二进制进行运算的运算符。下面以int型为例用代码来说明十进制转16和8进制的方法:
一、十进制转十六进制
  1. /*
  2. 十进制转16进制
  3. */
  4. public class ToOct{
  5.   public static void main(String[] args){
  6.     new ToOct(60);
  7.   }

  8.   public ToOct(int num){  //构造函数
  9.         int givenNum = num;
  10.     StringBuffer sb = new StringBuffer();  //存储字符串
  11.     while(num!=0){
  12.       int temp = num & 15;  //用&...1111即可取出二进制的后四位

  13.       //下面注意16进制中的大于9的数字要转换成字母
  14.       if(temp <= 9){
  15.                 sb.append(temp);
  16.       }else{
  17.                 sb.append((char)(temp - 10 + 'A'));
  18.       }

  19.       //右移4位<注意是无符号右移,否则如果num为负数,永远也移不完>
  20.       num = num >>> 4;
  21.     }
  22.     System.out.println(givenNum + "=" + sb.reverse());       
  23.   }
  24. }
复制代码

在命令行调试结果如下:
   
               经过系统提供的计算器来复核计算,确认计算无误。
---------------------------------------------------------------------------------------------------------------------------
下面以简图来表示通过位运算来进行 十进制—>十六进制:
十进制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