试图根据这些特性定义C++中的整数

试图根据这些特性定义C++中的整数,c++,C++,我需要创建一个整数,我们称之为X,其中X是从另一个整数中减去所需的量,我们称之为Y,使Y为2+1的最近幂,其中X不能大于Y的一半,并且假设Y还不是2+1的幂。例如,如果Y是19,我希望它是2+1的最接近的幂,也就是17,那么X需要是2。我真的很难弄明白这一点。提前感谢您提供的任何帮助。我们可以利用2的幂正好有一个位设置为1的特性:当按位and加上自身负1时,只有2和0的幂才会返回零 Let 'n' = number of bits in binary representation of Y X

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

我们可以利用2的幂正好有一个位设置为1的特性:当按位and加上自身负1时,只有2和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
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。

这听起来更像是一个简单的代数问题。你的意思是说你有一个任务要写一个计算机程序来解决这个问题吗?到目前为止你都做了些什么?我只是不知道如何基于Y来创建X:/我已经盯着这个问题看了一个小时了,我的大脑根本不想工作。那么,你能想出不用编写程序就可以手工完成的方法吗?例如,你是如何解决给定的Y为19的例子的?如果你能非常精确地描述手工解决问题的过程,那通常会让你有一个很好的开始来编写代码,如果我不需要编写代码,我也能做到。问题是,在19的例子中,我真的不知道如何在C++中创建x为2。就像我有附带的库math.h来做对数,我知道所有我需要做的事情的语法,我只是不知道如何使它工作。对:我的意思是,如果你能用英语写下这个过程,在非常小的简单步骤中,它可能会告诉你写代码需要做什么。既然你提到了对数,也许第一步是让log_y作为y的对数基数2。那么一旦你有了log_y,你接下来要做什么?虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。
int pow2plus1excess(int n)
{
    int pow2 = n - 1;
    for (int temp = pow2; temp > 0; temp &= temp - 1) pow2 = temp;
    return (n - 1) & ~pow2;
}