繁体   English   中英

使用 C 中的运算符从无符号整数中获取 6 个最高有效位的最佳方法?

[英]Best way to grab 6 most significant bits from an unsigned int using operators in C?

我已经设法摆脱了前几个位,但是我如何只保留 C 中的 6 个最高有效位? 我试过((num << 6) & 1)没有运气

要获得 integer 而不是 rest 的最高有效六位,请按位与设置高六位的掩码并清除 rest。

因为unsigned int是纯二进制类型,所以它的最大值UINT_MAX的所有位都已设置。 然后UINT_MAX >> 6将它们向右移动,产生高六位清零和 rest 设置的结果。 执行按位 NOT, ~ (UINT_MAX >> 6)会产生设置高六位且 rest 清除的结果。

然后num & ~ (UINT_MAX >> 6)产生num的高六位,其余位清零。

UINT_MAX<limits.h>中声明。 由于 C 对无符号类型的包装算法,您还可以使用-1u获得unsigned int的最大值,因此num & ~ (-1u >> 6)也可以使用。

通用方法不取决于 integer 的宽度

#define  C6B(num) ((num) & ~((1ull << (sizeof(num) * CHAR_BIT - 6)) - 1))

OP 希望将 6 个 MSbits 留在原来的位置 其他答案解决了这个问题。


如果我们希望这些转移到最不重要的地方,一个常见的解决方案如下所示。 这假设unsigned数具有 32 位。 虽然很常见,但 C 并未指定。

num >> (32 - 6)

或者,我们可以使用下面的。 这假设没有填充位,这对于unsigned来说很常见。

#include <limits.h>
num >> (sizeof num * CHAR_BIT - 6)

或者,我们可以不做任何假设并从UINT_MAXinteger 类型的值位中确定位宽:

// Bits in a MAX integer type
// https://stackoverflow.com/a/4589384/2410359
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))

#include <limits.h>
#define UINT_VALUE_BITS IMAX_BITS(UINT_MAX)

num >> (UINT_VALUE_BITS - 6)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM