试图在C++中根据这些特性定义一个整数
Trying to define an integer in C++ following these characteristics
我需要创建一个整数,我们称之为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。
相关文章:
- 跟随整数索引列表的自定义类迭代器
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 如何检查是否定义了固定宽度的整数
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 从 C++ 中定义的异常返回整数
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 定义整数之间的特殊划分
- 如何比较 #define 定义的字符串和整数
- 如何在C 中正确定义包含科学符号的整数矢量
- C++整数常量表达式定义
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 根据全局整数定义整数
- C++20 是否为"overflow"的有符号整数很好地定义了左移?
- C / C++中无符号整数的减法和比较是否定义良好?
- P1236R1:为什么 c++ 标准在定义整数时试图摆脱单词"bit"?
- 什么是快速整数?定义整数的速度
- 用整数填充自定义整数数组
- 如何在 C/C++ 中生成介于 0 和用户定义整数之间的随机数
- 如何在C++中创建自定义整数序列
- 操作符的算法重载-用于自定义整数类