这是做什么的
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
* string -'0'
是否删除了字符值?
答案 0 :(得分:7)
从string
指向字符'0'
的ASCII代码的字符中减去。因此,'0'
- '0'
会为您提供0
等等,'9'
- '0'
会为您提供9
。
整个循环基本上是“手动”计算字符串string
中指向的十进制整数的数值。
这是因为i << 3
相当于i * 8
而i << 1
相当于i * 2
而(i << 3) + (i<<1)
相当于i * 8 + i * 2
或{{1} }}
答案 1 :(得分:2)
它将ascii值0-9个字符转换为其数值。
'0'(字符)的ASCII值为48,'1'为49。 因此,要将48-56('0' - '9')转换为0-9,您只需要从ascii值中减去48。 这就是你的代码行[* string -'0']正在做的事情。
答案 2 :(得分:2)
由于数字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。