【发布时间】:2011-08-26 01:15:49
【问题描述】:
如何取消设置字的最高有效位(例如 0x00556844 -> 0x00156844)? gcc 中有一个__builtin_clz,但它只计算零,这对我来说是不需要的。另外,我应该如何将 __builtin_clz 替换为 msvc 或 intel c 编译器?
当前我的代码是
int msb = 1<< ((sizeof(int)*8)-__builtin_clz(input)-1);
int result = input & ~msb;
更新:好的,如果你说这段代码相当快,我会问你,我应该如何为这段代码添加可移植性?此版本适用于 GCC,但适用于 MSVC 和 ICC?
【问题讨论】:
-
“一个单词的最高有效位”,是第 22 位吗?那就是我在你的例子中看到的
-
不,它是给定 int 中设置的最高有效位。对于 0x12345678,结果将为 0x02345678;对于 0x00000123 -> 0x00000023
-
您的实现非常高效,实际上它比我的答案要好,因为编译器会优化减法
-
为了可移植性,您还应该使用
(sizeof(int)*CHAR_BIT)(CHAR_BIT在limits.h)而不是(sizeof(int)*8)。 -
David X,谢谢,但不需要如此广泛的可移植性。对可移植性感兴趣的只是最常见的 x86 和 x86_64 编译器。此代码将由少数用户在桌面和小型集群上使用。
标签: c micro-optimization bitarray