我通常可以理解大多数 C 代码,但这个代码超出了我的理解范围。
#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
示例用法如下:
int x = 57;
kroundup32(x);
//x is now 64
其他几个例子是:
1对1
2对2
7 到 8
31 至 32
60 到 64
3000 到 4096
我知道它会将整数四舍五入为最接近的 2 的幂,但据我所知,这差不多。
如有任何解释,我们将不胜感激。
谢谢
最佳答案
(--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
- 将 x 减少 1
- 或 x 与 (x/2)。
- 或 x 与 (x/4)。
- 或 x 与 (x/16)。
- 或 x 与 (x/256)。
- 或 x 与 (x/65536)。
- 将 x 增加 1。
对于 32 位无符号整数,这应该将值向上移动到最接近等于或大于 2 的幂。 OR 部分将所有低位设置在最高位下方,因此它最终是 2 减一的幂,然后再将其加一。看起来它有些优化,因此可读性不强;单独通过按位运算和位移以及作为宏来完成(因此没有函数调用开销)。
关于有人可以帮忙解释一下这个 C one liner 的作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384852/