试图在C++中根据这些特性定义一个整数

Trying to define an integer in C++ following these characteristics

本文关键字:定义 整数 一个 C++      更新时间:2023-10-16

我需要创建一个整数,我们称之为X,其中X是从另一个整数中减去所需的量,我们称其为Y,使Y成为2+1的最接近幂,其中X不能大于Y的一半,并假设Y还不是2+1的幂。例如,如果Y是19,我希望它是2+1的最接近幂,也就是17,那么X需要是2。我很难弄清楚这一点。提前感谢你能提供的任何帮助。

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
#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的幂恰好有一位设置为1的特性:当与自身减1进行逐位and运算时,只有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。