这是做什么的
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
*字符串-'0'
它会删除字符值还是什么?
这从string
指向该字符的 ASCII 代码的字符中减去'0'
。所以,'0'
-'0'
给你0
等等和'9'
-'0'
给你9
。
string
整个循环基本上是“手动”计算字符串指向的十进制整数的数值。
这是因为i << 3
is 等价于i * 8
andi << 1
等价于i * 2
and(i << 3) + (i<<1)
等价于i * 8 + i * 2
or 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' ] 正在做的事情。