A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一步一脚印 中级黑马   /  2013-11-17 20:47  /  1361 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一步一脚印 于 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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

4 个回复

倒序浏览
本帖最后由 天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.




评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
<<是位运算符里的左移1的十六进制0000 0001 左移四位 0000 1000 就是16  左移一位相当于乘2

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 以技术分鼓励新同学的到来!

查看全部评分

回复 使用道具 举报
刚才调试了半天,n * (1<<(4*i)的意思就是n左移了4乘以i位  即当i=1时,n左移4位其实可以写成n<<(4*i)当=0时,n左移2的0次方即乘以1.希望可以帮到楼主。。。。
回复 使用道具 举报
帖子已分类,若仍有疑惑,可重新提问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马