gpt4 book ai didi

c - 计算存储数字 n 所需位数的宏

转载 作者:太空狗 更新时间:2023-10-29 16:45:01 25 4
gpt4 key购买 nike

假设我需要编写 C 宏来返回存储无符号 32 位整数所需的位数 (1..32)。 (结果等于上限(log2(n))。

我需要它作为编译时计算宏,而不是函数。

我能做到

 #define NBITS(n) ((n)&(1<<31)?32:(n)&(1<<30)?31:...

它有效,但相当长。 (这里速度无关紧要,计算是在编译时进行的)。

有没有更短的方法来编写这个宏?最短?

最佳答案

#define NBITS2(n) ((n&2)?1:0)
#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n)))
#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n)))
#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n)))
#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n)))
#define NBITS(n) (n==0?0:NBITS32(n)+1)
#include <iostream>
using namespace std;

int main(){
cout << NBITS(0) << endl;
cout << NBITS(1) << endl;
cout << NBITS(2) << endl;
cout << NBITS(3) << endl;
cout << NBITS(4) << endl;
cout << NBITS(1023) << endl;
cout << NBITS(1024) << endl;
}

好不好?

关于c - 计算存储数字 n 所需位数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com