Используя математическое соотношение:
1/3 == Sum[1/2^(2n), {n, 1, Infinity}]
У нас есть
int div3 (int x) {
int64_t blown_up_x = x;
for (int power = 1; power < 32; power += 2)
blown_up_x += ((int64_t)x) << power;
return (int)(blown_up_x >> 33);
}
Если вы можете использовать только 32-разрядные целые числа,
int div3 (int x) {
int two_third = 0, four_third = 0;
for (int power = 0; power < 31; power += 2) {
four_third += x >> power;
two_third += x >> (power + 1);
}
return (four_third - two_third) >> 2;
}
4/3 - 2/3
лечение используется потому что x >> 1
это floor(x/2)
вместо round(x/2)
.