在C中使用操作符从unsigned int中获取6个最有效位的最佳方法?



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

要获得整数的最高六位而不是其余六位,请将其与掩码按位与,设置高六位,其余六位清除。

因为unsigned int是一个纯二进制类型,它的最大值UINT_MAX集合了它所有的位。然后UINT_MAX >> 6将这些移到右边,产生一个结果,高6位清除,其余的设置。执行按位NOT (~ (UINT_MAX >> 6)),产生的结果是设置高六位,其余六位清除。

num & ~ (UINT_MAX >> 6)产生num的高6位,剩余六位清空。

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

不依赖于整数宽度的通用方法

#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_MAX和整型的值位确定位宽:

// 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)

相关内容

  • 没有找到相关文章

最新更新