有人可以帮忙解释一下这个 C one liner 的作用吗?

标签 c

我通常可以理解大多数 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))
  1. 将 x 减少 1
  2. 或 x 与 (x/2)。
  3. 或 x 与 (x/4)。
  4. 或 x 与 (x/16)。
  5. 或 x 与 (x/256)。
  6. 或 x 与 (x/65536)。
  7. 将 x 增加 1。

对于 32 位无符号整数,这应该将值向上移动到最接近等于或大于 2 的幂。 OR 部分将所有低位设置在最高位下方,因此它最终是 2 减一的幂,然后再将其加一。看起来它有些优化,因此可读性不强;单独通过按位运算和位移以及作为宏来完成(因此没有函数调用开销)。

关于有人可以帮忙解释一下这个 C one liner 的作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384852/

相关文章:

c - Openssl 中 RSA 结构的大小和公钥的大小

C: 带有 MinGW 的正则表达式库

c - alloca 而不是 alsa 中的局部变量

c - 如何在 ARM 中使用字符串?

c - chdir(...) 和系统 ("cd ..."之间的区别是什么?

c - 存储大小未知

c - 赋值从指针生成整数而不进行强制转换 [-Wint-conversion]

MySQL C API 编译错误,找不到 crtdbg.h

c - makefile 中没有获取变量的分配

c - 程序执行时显示完成进度