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';
乘以2就是移位,比如"1110"换成十进制,(1 * 2^3 + '1' - '0') + (1 * 2^2 + '1' - '0')+ (1 * 2^1 + '1' - '0')+(1 * 2^0 + '0' - '0')
按你这么说 道理对 可答案不对啊
1、binaryString.charAt(i) - '0'
获得第i位数字的值。字符的值是一个ascii码,减去'0'(即字符0的ascii码)得到对应的数字的值。
2、value *2
因为你说的是二进制,左边是高位,所以左移一位(乘以2)。这代码修改为 (value << 1)性能要更高。
这个算法有一个漏洞:如果字符串的值不是 一个正确的二进制时,没有做安全检测,特别的,是一些别的字母的时候,更有问题。
大哥 我还是有点没懂 你说的移位 和 赋值 这个我明白 我就不明白
他是从头往后走的,, 比如 字符串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';
}
算出来这个样子 我就有点蒙了。。。
@询问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、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.
多看几遍会搞懂的,加油!
mark
楼上的解释很详细了,领会精神。