如何在C ++中获得整数的j个最高位?

时间:2015-02-23 23:11:43

标签: c++ bit

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

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

你能为最重要的位做类似的事情吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:2)

简单地右移:(警告,当你想要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和此处:http://coliru.stacked-crooked.com/a/29bc40188d852dd3