使用移位运算符除以任意数字

时间:2009-11-27 10:34:55

标签: c++ bit-shift

如何使用移位运算符和加法项将数字n除以24

n % 24 == 0

4 个答案:

答案 0 :(得分:4)

划分的铅笔和纸算法仅使用“移位”(基数10移位)和减法。你可以在基地2做同样的事情。

抱歉,我找不到该算法的链接,但您应该在孩提时候学习它。

编辑:实际上由于添加很便宜,你不必逐个尝试提取正确的数字,所以你可以简化算法...

假设正分红和除数......

取两个立即大于除数的力(这里是32)。

很容易将你的数字除以2的幂。假设分裂产生k1。 从数字中减去k1*24(调用其余的r1)并迭代...

当您获得k1k2,... 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的幂才有意义。即便如此,它更可能混淆读者而不是产生更有效的代码使用现代编译器。