尝试在遵循这些特征的C ++中定义整数

时间:2015-11-07 02:01:37

标签: c++

我需要创建一个整数,让我们称之为X,其中X是从另一个整数中减去所需的量,让我们调用Y,使Y最接近2 + 1的幂,其中X不能大于Y的一半,并假设Y不是2 + 1的幂。例如,如果Y是19,我希望它是2 + 1的最接近的幂,即17,那么X将需要为2我正在努力解决这个问题。提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:0)

Let 'n' = number of bits in binary representation of Y
X = Y - (2 pow (n-1) + 1);

ex: Y = 19 ( 5 bits)
n = 5.
X = 19 - (2 pow 4 + 1) = 19 - 17 = 2

答案 1 :(得分:0)

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
   int y = 63;
   int minx = log2(y);
   int x = y - (pow(2,minx) + 1);
   if (x > y / 2) 
   {
       x = y / 2;
   }
   cout << x << endl;
   return 0;
}

答案 2 :(得分:0)

我们可以利用2的幂只有一位设置为1的属性:当与自身进行逐位AND运算减去1时,只有2(和零)的幂将返回零。

int ispow2plus1(int n)
{
    int pow2 = n - 1;
    return pow2 != 0 && (pow2 & (pow2 - 1)) == 0;
}

考虑33. pow2则为32,不为零,pow2 & (pow2 - 1)等于32 & 31 - 二进制,100000 & 011111,为零。

编辑:根据异地聊天中的误解,有些问题不足。你还需要找到最重要的1位,以防你所拥有的实际上不是2加1的幂。我已经不在这里以避免使用浮点数学,因此循环删除pow2中最重要的1位以外的其他位。

int pow2plus1excess(int n)
{
    int pow2 = n - 1;
    for (int temp = pow2; temp > 0; temp &= temp - 1) pow2 = temp;
    return (n - 1) & ~pow2;
}

如果数字是2加1的幂,则返回0,否则超出该点。 1,2,3,9和33都返回0,而16则返回7。