我有问题如何解决这个,我正在考虑回归 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;
}
答案 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 ) );
}