在 C++ 中如何获取整数的第 j 个最高有效位?

How can you get the j first most significant bits of an integer in C++?

我知道要获取整数的前 j 个最低有效位,您可以执行以下操作:

  int res = (myInteger & ((1<<j)-1))

你能为最高有效位做类似的事情吗?

要获取整数(或者更确切地说是无符号整数,因为有符号整数中的按位运算是痛苦的秘诀)的 j 最高位:

unsigned res = myUnsignedInteger & ~(~0u >> j);

~0u 仅包含设置位。将 j 位向右移动给我们 j 左侧的零位,然后是一位,并且反转给我们 j 左侧的一位,然后是零,这是我们需要隔离另一个整数的 j 最高位的掩码。

注意:这是在您希望隔离位保留在同一位置的假设下,也就是说

(0xdeadbeef & ~(~0u >> 12)) == 0xdea00000

简单右移:(警告,当你想要 0 位时失败,但你的所有位都失败)

unsigned dropbits = CHAR_BIT*sizeof(int)-j;
//if you want the high bits moved to low bit position, use this:
ullong res = (ullong)myInteger >> dropbits; 
//if you want the high bits in the origonal position, use this:
ullong res = (ullong)myInteger >> dropbits << dropbits;

重要!强制转换必须是您类型的未签名版本

还需要注意的是,当您请求所有(32?)位时,最低 j 位的代码会失败。因此,双移会更容易:

unsigned dropbits = CHAR_BIT*sizeof(int)-j;
ullong res = (ullong)myInteger << dropbits >> dropbits;

看到它在这里工作:http://coliru.stacked-crooked.com/a/64eb843b3b255278 and here: http://coliru.stacked-crooked.com/a/29bc40188d852dd3