我已经设法摆脱了前几位,但我如何只保留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)