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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面的代码实现了该功能,只是sum+=n*(1<<(4*i));怎么理解?
  1. String s="ab";
  2.           //System.out.println(Integer.parseInt(s,16));
  3.            int sum=0;
  4.           
  5.           int len = s.length();
  6.           for (int i = 0; i < len; i++) {
  7.                 char c=s.charAt(len-1-i);
  8.                 int n=Character.digit(c, 16);
  9.                 //System.out.println(n);
  10.                 sum+=n*(1<<(4*i));
  11.           }
  12.           System.out.println(sum);
复制代码


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

9 个回复

倒序浏览
sum+=n*(1<<(4*i))
a<<b;是将a左移b位!
这段代码,就是sum = sum + n * 将1左移(4*i)位的结果

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报

我不是想问这个,我这是想问这个语句在整个代码中是什么意思,为什么要这么做,十六进制转成十进制的原理是什么
回复 使用道具 举报
本帖最后由 石头6004 于 2013-11-28 16:50 编辑
  1. package cn.itcast;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 String s="ab";
  6.         //System.out.println(Integer.parseInt(s,16));
  7.          int sum=0;
  8.         
  9.         int len = s.length();
  10.         for (int i = 0; i < len; i++) {
  11.               char c=s.charAt(len-1-i);                //返回指定索引处的Char值
  12.               int n=Character.digit(c, 16);        //返回使用指定基数的字符 c 的数值。
  13.               System.out.println(n);
  14.               sum+=n*(1<<(4*i));
  15. //            这句代码是为了将每一次循环所得的c的数值进行进制转换,并且依次累计叠加
  16.         }
  17.         System.out.println(sum);
  18.         }
  19. }
  20. //十六进制转成十进制的原理是:将数字进行左移位4位;
  21. //根据8 4 2 1 码进行转换!
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报



十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,依此类推
所以,在第N(N从0开始)位上,如果是是数 X,就表示X * 16的N次方。
例如:
将十六进数 F2转换成10进制:

2 * 16^0 + F * 16^1=  2 + 240 = 240

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  1. String s = "ab";
  2.                 // System.out.println(Integer.parseInt(s,16));
  3.                 int sum = 0;

  4.                 int len = s.length();
  5.                 for (int i = 0; i < len; i++) {
  6.                        
  7.                         //  charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法.
  8.                         //charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
  9.                         //如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.
  10.                        
  11.                         char c = s.charAt(len - 1 - i);
  12.                        
  13.                         // 在指定的基数返回字符char的数值。
  14.                        
  15.                         int n = Character.digit(c, 16);
  16.                        
  17.                         // b = 11 ; a = 10 十六进制转换为十进制,每一位上的值乘以8的n-1次方(n为位数)
  18.                        
  19.                         sum += n * (1 << (4 * i));
  20.                         /**<<位运算符
  21.                          *
  22.                          * i=0   4 * i=0   左移0位
  23.                          * (1)0000 0001  ->  (1)0000 0001
  24.                          *
  25.                          * i=1    4 * i=4   左移4位
  26.                          * (1)0000 0001  ->  (16)0001 0000
  27.                          *
  28.                          * 1 << (4 * i)  相当于   2*(2的4*i次方/16的i次方)
  29.                          *
  30.                          * n * (1 << (4 * i));   n*(16的i次方)
  31.                          */
  32.                 }
  33.                 System.out.println(sum);
复制代码
回复 使用道具 举报
石头6004 发表于 2013-11-28 16:53
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,依此类推
所以,在第N(N从0开始)位上 ...

嗯,明白了,太感谢了,一开始就是以为1<<0等于0给晕了。其实是1<<0=1,1<<1=2,1<<2=4...也就是
2^0=1,2^1=2,2^2=4...那么1<<(4*i)也就是16的i次方了
回复 使用道具 举报
我的上一条回复29行书写错误,是
  1. // 1 << (4 * i)  相当于   2的4*i次方/16的i次方
复制代码
回复 使用道具 举报

嗯嗯,谢谢,明白了
回复 使用道具 举报
我现在也学到这里,对于没有基础来说,有点难的感觉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马