|
|
|
|
|
by wholesomepotato
927 days ago
|
|
it's one XOR, SHL, OR, SHR, AND, on some archs the shifts might come free with the other instruction. I'd expect it to be faster. a = v ^ 0x30303030lu // normalize to digits 0xXX0a0b0c b = (a << 12) | a // combine into XXXXXbacb0c idx = (b >> 12) & 0xfff // get bac res = lookup[idx] |
|
a = ((a >> 12) | a) & 0xfff
You could also skip the xor with 0x303030 by adjusting the lookup table accordingly.
Unfortunately, you'd still need to factor in the length argument somehow. That is, if given "23" with length=1, it should parse to 2, not 23. You could address this with a variable shift, but at that point, I can't see it being any better than a multiply+shift, even assuming the lookup table is fully cached.
The other major issue is validation, which the lookup table doesn't help much with.