如果我有一个整数n
,我怎样才能找到的下一个号码k > n
,使得k = 2^i
,其中一些i
的元件N
由按位移动或逻辑.
示例:如果我有n = 123
,我怎么能找到k = 128
,哪个是2的幂,而不是124
哪个只能被2整除.这应该很简单,但它让我望而却步.
我正在为嵌入式系统开发一些C++代码.代码使用的I/O接口要求每条消息的大小(以字节为单位)是2的幂.现在,代码执行类似的操作(在几个地方):
#pragma pack(1)
struct Message
{
struct internal_
{
unsigned long member1;
unsigned long member2;
unsigned long member3;
/* more members */
} internal;
char pad[64-sizeof(internal_)];
};
#pragma pack()
Run Code Online (Sandbox Code Playgroud)
我正在尝试首次在64位Fedora上编译代码,其中long
64位.在这种情况下,sizeof(internal_)
大于64,数组大小表达式下溢,并且编译器抱怨数组太大.
理想情况下,我希望能够编写一个宏来获取结构的大小,并在编译时评估填充数组所需的大小,以便将结构的大小舍入为2的幂.
我看过Bit Twiddling Hacks页面,但我不知道是否有任何技术可以在宏中实现,以便在编译时进行评估.
这个问题的任何其他解决方案?或者我应该延续这个问题,只需将神奇的64改为神奇的128?