首页 新闻 会员 周边 捐助

二进制转十进制 这段代码 怎么理解的

0
[待解决问题]

int value = binaryString.charAt(0) - '0';
  for (int i = 1; i < binaryString.length(); i++) {
    value = value * 2 + binaryString.charAt(i) - '0';
  }

return value;

 

尤其中间那行 有点不太明白 、

value = value * 2 + binaryString.charAt(i) - '0';

询问java1的主页 询问java1 | 初学一级 | 园豆:72
提问于:2014-08-24 19:16
< >
分享
所有回答(5)
0

乘以2就是移位,比如"1110"换成十进制,(1 * 2^3 + '1' - '0') + (1 * 2^2 + '1' - '0')+ (1 * 2^1 + '1' - '0')+(1 * 2^0 + '0' - '0')

jello chen | 园豆:7336 (大侠五级) | 2014-08-24 19:40

按你这么说 道理对 可答案不对啊

支持(0) 反对(0) 询问java1 | 园豆:72 (初学一级) | 2014-08-24 22:23
0

1、binaryString.charAt(i) - '0'

获得第i位数字的值。字符的值是一个ascii码,减去'0'(即字符0的ascii码)得到对应的数字的值。

2、value *2

因为你说的是二进制,左边是高位,所以左移一位(乘以2)。这代码修改为 (value << 1)性能要更高。

 

这个算法有一个漏洞:如果字符串的值不是 一个正确的二进制时,没有做安全检测,特别的,是一些别的字母的时候,更有问题。

519740105 | 园豆:5810 (大侠五级) | 2014-08-24 20:06

大哥 我还是有点没懂 你说的移位 和 赋值 这个我明白 我就不明白

他是从头往后走的,, 比如 字符串1010 

// 4
for (int i = 1; i < binaryString.length(); i++) {
// 1 * 2 + 0 - 0
// 2 * 2 + 1 - 0
// 5 * 2 + 0 - 0
value = value * 2 + binaryString.charAt(i) - '0';

}

算出来这个样子 我就有点蒙了。。。

支持(0) 反对(0) 询问java1 | 园豆:72 (初学一级) | 2014-08-24 22:13

@询问java1: 因为我们在识别二进制(不仅仅二进制)的时候,高位在左边,所以有了这个算法:

对字符串分成两串:左边和右边,那么左边的数据位数一定要乘以进制的右边位数的乘方,再加上右边:

如:1011分解为10和11的话,那么:10 * 2^2 + 11就是具体的值。

这个算法也可以先从右边算起,但那样会复杂:

int length = binaryString.Length;

int value = binaryString.charAt(length - 1) - '0';

for (int i = length - 2; i > 0; i--)

{

      int bit = binaryString.charAt(i) - '0';

      if(bit == 0)

     {

           continue;

     }

   value = value + 2^(length - i - 1);

}

return value;

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 08:44
1

二进制转十进制
从最后一位开始算,依次列为第0、1、2...位第n位的数(0或1)乘以2的n次方得到的结果相加就是答案
例如:01101011.转十进制:
第0位:1乘2的0次方=1
1乘2的1次方=2
0乘2的2次方=0
1乘2的3次方=8
0乘2的4次方=0
1乘2的5次方=32
1乘2的6次方=64
0乘2的7次方=0
然后:1+2+0+8+0+32+64+0=107.
二进制01101011=十进制107.

多看几遍会搞懂的,加油!

LiuKaiFa | 园豆:1491 (小虾三级) | 2014-08-25 08:25
0

mark

摇啊摇啊摇 | 园豆:408 (菜鸟二级) | 2014-08-25 09:40
0

楼上的解释很详细了,领会精神。

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-08-25 14:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册