2

这是做什么的

while(*string) {
    i = (i << 3) + (i<<1) + (*string -'0');
    string++;
}

*字符串-'0'

它会删除字符值还是什么?

4

3 回答 3

7

这从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

于 2012-10-17T04:29:42.903 回答
3

由于数字 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 为例。

于 2012-10-17T04:29:09.263 回答
2

它将 0-9 个字符的 ascii 值转换为其数值。

'0'(字符)的 ASCII 值是 48,'1' 是 49。因此要将 48-56('0'-'9') 转换为 0-9,只需从 ascii 值中减去 48。这就是您的代码行 [ *string -'0' ] 正在做的事情。

于 2012-10-17T04:28:34.740 回答