黑马程序员技术交流社区
标题:
一题面试题解法
[打印本页]
作者:
一步一脚印
时间:
2013-11-17 20:47
标题:
一题面试题解法
本帖最后由 一步一脚印 于 2013-11-17 20:49 编辑
sum += n * (1<<(4*i)); 最后一段,不是很能理解。有谁能解释一下吗?
复制代码
编写一个函数将一个十六进制数的字符串参数转换成整数返回。
//自定义一个十六进制
String str = “13abf”;
//获取长度
int len = str.length;
int sum = 0;
for(int i=0;i<len;i++){//B
//第1次是5-1-i(0)//第2次是5-1-i(1)//第1次是5-1-i(2)//第1次是5-1-i(3)....
//倒序,<-----百十个
char c = str.charAt(len-1-i);
//获取相应十六进制的值,返回一个int类型
int n = Character.digit(c,16);
//第1次n=f(15) 先计算4*i(0)次。再1<<左移0 ;1乘0的二次方。...再和sum相加。
//不明白为什么要 用4来乘????
sum += n * (1<<(4*i));
}
复制代码
作者:
天ya~_琼楼
时间:
2013-11-17 21:43
本帖最后由 天ya~_琼楼 于 2013-11-17 21:44 编辑
十六进制转十进制与二进制转十进制方法一样,即:
H
n
×16^n+H
n-1
×16^(n-1)+……+H
0
×16^0
因此楼主前边的代码我就不多解释了,就是从后向前取字符,将16进制的单个字符转换成十进制,例如最先娶到f,转换为15,对应H
0,
b转换成十进制11,对应H
1
,……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