gpt4 book ai didi

c - 使用位操作提取位

转载 作者:行者123 更新时间:2023-12-04 06:14:20 25 4
gpt4 key购买 nike

我有一个 32 位无符号整数,我需要在给定位置提取位并从这些位中生成一个新数字。例如,如果我有一个 0xFFFFFFFF 并且想要位 0,10,11,我的结果将是 7 (111b)。

这是我的尝试,它正确提取了位,但没有创建正确的结果。我正在将结果向左移动 1 个位置并与我提取的位进行 AND 运算,但显然这是不正确的?

我也确定可能有更优雅的方法来做到这一点?

#define TEST 0xFFFFFFFF

unsigned int extractBits(unsigned short positions[], unsigned short count, unsigned int bytes)
{
unsigned int result = 0;
unsigned int bitmask = 0;
unsigned short bit = 0;
int i = 0;

for(i = 0; i < count; i++) {
bitmask = 2 << (positions[i] -1);
if(bitmask == 0) bitmask = 1;

bit = bytes & bitmask;
bit = bit >> positions[i];

result = result << 1;
result = result & bit;
}

if(result != 31) {
printf("FAIL");
}

return result;
}

int main(void)
{
unsigned short positions[5] = {8, 6, 4, 2, 0};
unsigned int result = extractBits(positions, 5, TEST);

printf("Result: %d\n", result);

return 0;
}

最佳答案

由于您是在挑选单个位,因此没有理由将位掩码设为变量;只需将所需的位移入单位位,并使用 1 的掩码。例如:

...
result = (2*result) | ((bytes >> positions[i]) & 1);
...

许多编译器为 2*result 生成相同的代码和 result<<1 ,所以使用你喜欢的任何一个。

请注意,如果您正在设计界面并且没有充分的理由使用 short positions[] 的整数和 count就像你做的那样,然后不要。保持一致并以相同的方式指定所有整数。

关于c - 使用位操作提取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444394/

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