与按3乘以3时检查溢出

时间:2014-09-11 16:20:05

标签: overflow bit-manipulation

我有问题如何解决这个,我正在考虑回归 int product = 3 * n; return(!n || product / n == 3); 但是,我不能使用那些运营商。

    /*
     *  Overflow detection of 3*n 
     *    Input is positive
     *    Example:  overflow( 10 ) = 0
     *    Example:  overlfow( 1<<30 ) = 1
     *    Legal ops:  & | >> << ~
     *    Max ops:  10
     *
     *    Number of X86 instructions:
     */
     int overflow_3( int n ) {

     return 2;
     }

2 个答案:

答案 0 :(得分:0)

该条件等效于检查x是否大于MAX_INT / 3,即x> 0x2aaaaaaa。由于已知x为非负数,因此我们知道最高位为零,因此可以按以下方式检查条件:

unsigned overflow(unsigned x) {
  return (x + 0x55555555) >> 31;
}

答案 1 :(得分:-1)

当乘以3时,数字有两种可能的溢出选项。 让我们来看看X3乘法。有两个动作:
 1.向左移动1离开最左边的位集。只有在最左边(即30)位置位时才会发生这种情况  2.向左移动1,最左边的位未设置。但是,下面添加原始数字会导致设置位。这种情况只有在29位置位时才会发生(因为它是唯一一个在移位后变为30的位)并且如果28位或27位置位(因为它们可以溢出到30位)。然而27但是它本身被设置是不够的(因为我们需要设置26位,或者第25和第24位)等等。

所以基本上你需要一个循环。但是由于不允许循环,我会使用递归。所以:

    int overflow_3(int n){
     return n >> 30 || (n >> 29 && overflow_3( (n & ( (1 << 29) - 1)) << 2 ) );
   }