黑马程序员技术交流社区

标题: 一题面试题解法 [打印本页]

作者: 一步一脚印    时间: 2013-11-17 20:47
标题: 一题面试题解法
本帖最后由 一步一脚印 于 2013-11-17 20:49 编辑
  1. sum += n * (1<<(4*i)); 最后一段,不是很能理解。有谁能解释一下吗?
复制代码

  1. 编写一个函数将一个十六进制数的字符串参数转换成整数返回。
  2. //自定义一个十六进制
  3.         String str = “13abf”;
  4. //获取长度
  5.         int len = str.length;
  6.         int sum = 0;
  7.         for(int i=0;i<len;i++){//B
  8. //第1次是5-1-i(0)//第2次是5-1-i(1)//第1次是5-1-i(2)//第1次是5-1-i(3)....
  9. //倒序,<-----百十个  
  10.                 char c = str.charAt(len-1-i);
  11. //获取相应十六进制的值,返回一个int类型
  12.                 int n = Character.digit(c,16);
  13. //第1次n=f(15)  先计算4*i(0)次。再1<<左移0  ;1乘0的二次方。...再和sum相加。

  14. //不明白为什么要   用4来乘????
  15.          sum += n * (1<<(4*i));        
  16.         }
复制代码


作者: 天ya~_琼楼    时间: 2013-11-17 21:43
本帖最后由 天ya~_琼楼 于 2013-11-17 21:44 编辑

十六进制转十进制与二进制转十进制方法一样,即:
Hn×16^n+Hn-1×16^(n-1)+……+H0×16^0因此楼主前边的代码我就不多解释了,就是从后向前取字符,将16进制的单个字符转换成十进制,例如最先娶到f,转换为15,对应H0,b转换成十进制11,对应H1,……1就对应十进制的1.
所以结果是sum=1*16^4+3*16^3+10*16^2+11*16^1+15*16^0
上式中16的0、1、2、3、4次幂就是楼主代码中对应的i,1、3、10、11、15对应结果计算中的n。
对比楼主的公式sum += n * (1<<(4*i))=n*(1*2^(4i))=n*16^i;
这就是最上边的公式了。
简单一句话,wei什么用4来乘,因为1<<4,就是16.





作者: 风逝    时间: 2013-11-17 21:51
<<是位运算符里的左移1的十六进制0000 0001 左移四位 0000 1000 就是16  左移一位相当于乘2
作者: hubby    时间: 2013-11-17 21:55
刚才调试了半天,n * (1<<(4*i)的意思就是n左移了4乘以i位  即当i=1时,n左移4位其实可以写成n<<(4*i)当=0时,n左移2的0次方即乘以1.希望可以帮到楼主。。。。
作者: 黄炳期    时间: 2013-11-18 12:52
帖子已分类,若仍有疑惑,可重新提问




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2