这是做什么的
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
*字符串-'0'
它会删除字符值还是什么?
这从string指向该字符的 ASCII 代码的字符中减去'0'。所以,'0'-'0'给你0等等和'9'-'0'给你9。
string整个循环基本上是“手动”计算字符串指向的十进制整数的数值。
这是因为i << 3is 等价于i * 8andi << 1等价于i * 2and(i << 3) + (i<<1)等价于i * 8 + i * 2or i * 10。
由于数字 0-9 保证在字符集中连续存储,因此减法'0'给出了您拥有的任何字符数字的整数值。
假设您使用的是 ASCII:
char digit = '6'; //value of 54 in ASCII
int actual = digit - '0'; //'0' is 48 in ASCII, therefore `actual` is 6.
无论数字在字符集中具有哪些值,由于它们是连续的,因此'0'从数字中减去开头 ( ) 将得到您要查找的数字。请注意,对于字母来说,情况并非如此。以 EBCDIC 为例。
它将 0-9 个字符的 ascii 值转换为其数值。
'0'(字符)的 ASCII 值是 48,'1' 是 49。因此要将 48-56('0'-'9') 转换为 0-9,只需从 ascii 值中减去 48。这就是您的代码行 [ *string -'0' ] 正在做的事情。