gpt4 book ai didi

c - 获取位域中唯一位的数量

转载 作者:行者123 更新时间:2023-12-02 18:10:34 27 4
gpt4 key购买 nike

我有一个 32 位位字段,其中设置了一位。我如何获得该位的编号(如 int 或其他)?

示例(为简洁起见,使用 8 位):

Input              Desired output
0x01 / 00000001 -> 0
0x04 / 00000100 -> 2
0x08 / 00001000 -> 3
0x00 / 00000000 -> undefined/whatever
0x06 / 00000110 -> undefined/whatever

我正在寻找简洁且可读的代码或通用库函数,而不是最聪明或性能最佳的解决方案。

最佳答案

您可以为此使用内置编译器。 gccclang 支持这一点:

Built-in Function: int __builtin_clz(unsigned int x)

Returns the number of leading 0-bits in x, starting at the most significant bit position. If x is 0, the result is undefined.

int bit_index32(unsigned x) {
return 31 - __builtin_clz(x);
}

要获得更便携的解决方案,您可以使用简单的循环:

int bit_index32(unsigned x) {
int n = 0;
while (x > 1) { n++; x >>= 1; }
return n;
}

一种更快的测试,只需 5 次测试,而不是最多 31 次:

int bit_index32(unsigned x) {
int n = 0;
if (x > 0xFFFF) { n += 16; x >>= 16; }
if (x > 0xFF) { n += 8; x >>= 8; }
if (x > 0xF) { n += 4; x >>= 4; }
if (x > 0x3) { n += 2; x >>= 2; }
if (x > 0x1) { n += 1; x >>= 1; }
return n;
}

由于v是2的幂,因此索引是v-1中的位数,无需测试即可计算:

int bit_index32(unsigned v) {
v--;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
}

另一种无分支的,仅适用于 2 的幂:

int bit_index32(unsigned v) {
return !!(v & 0xAAAAAAAA)
| !!(v & 0xCCCCCCCC) << 1
| !!(v & 0xF0F0F0F0) << 2
| !!(v & 0xFF00FF00) << 3
| !!(v & 0xFFFF0000) << 4;
}

在肖恩·安德森 (Sean Anderson) 享受更多乐趣 Bit Twiddling Hacks !

关于c - 获取位域中唯一位的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72420084/

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