如何使用移位运算符和加法项将数字n
除以24
?
(n % 24 == 0
)
答案 0 :(得分:4)
划分的铅笔和纸算法仅使用“移位”(基数10移位)和减法。你可以在基地2做同样的事情。
抱歉,我找不到该算法的链接,但您应该在孩提时候学习它。
编辑:实际上由于添加很便宜,你不必逐个尝试提取正确的数字,所以你可以简化算法...假设正分红和除数......
取两个立即大于除数的力(这里是32)。
很容易将你的数字除以2的幂。假设分裂产生k1
。
从数字中减去k1*24
(调用其余的r1
)并迭代...
当您获得k1
,k2
,... kn
个数字且其余rn
不再包含32时,请进行最后一次检查,看看是否{{ 1}}包含24。
除法的结果是rn
。
答案 1 :(得分:2)
首先找到结果的最高位,然后再返回。
int div24(int value) {
// Find the smallest value of n such that (24<<n) > value
int tmp = 24;
for (int n = 0; tmp < value; ++n)
tmp <<= 1;
// Now start working backwards to find bits of the result. This is O(i).
int result = 0;
while(value != 0) {
tmp >>= 1;
result <<= 1;
if (value > tmp) { // Found one bit.
value -= tmp; // Subtract (24<<i)
result++;
}
}
return result;
}
示例:
Value = 120 : n = 2
Step 0: tmp = 96, result = 0, value = 24, result = 1
Step 1: tmp = 48, result = 2
Step 2: tmp = 24, result = 4, value = 0, result = 5
答案 2 :(得分:1)
int
div24(int value) {
int result = 0;
while (value >= 24) {
int accum = 24;
int tmp = 1;
while (accum + accum <= value) {
accum += accum;
tmp += tmp;
}
value -= accum;
result += tmp;
}
return result;
}
答案 3 :(得分:0)
虽然毫无疑问是一个24的聪明黑客,使用移位运算符[和/或减法]只对2的幂才有意义。即便如此,它更可能混淆读者而不是产生更有效的代码使用现代编译器。