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