Determine if an integer is divisible by 3
C - 2 tokens
int div3(int x) {
return x * 0xAAAAAAAB <= x;
}
Seems to work up to 231-1.
Credits to zalgo("nhahtdh")
for the multiplicative inverse idea.
Python, 3 2 tokens
Brute force solution, but it works.
0x9249249249249249249249249249249249249249249249249249249249249249>>x&1
Thanks to Howard for the 1 token reduction.
C - 5 4 (?) tokens
int div3_m2(uint32_t n) {
return n == 3 * (n * 0xAAAAAAABull >> 33);
}
Works for any unsigned 32-bit number.
This code makes use of multiplicative inverse modulo 232 of a divisor to convert division operation into multiplication operation.
Edit
My solution (posted 2 minutes after) has the same spirit as aditsu's solution. Credit to him for the use of ==
that improves my solution by 1 token.
Reference
- Labor of Division - ridiculousfish.com
- Hacker's Delight - Magic Number
- Wikipedia - Modular multiplicative inverse