Java按位导致奇怪的结果

时间:2018-12-15 21:20:59

标签: java bitwise-operators bit-shift

我正在尝试使用int表示寄存器值。我需要数字的各个部分(以二进制形式)来设置控制线等的状态。

我的代码可以正常工作,直到达到4096号为止,此时我的边界停止表现。

我的边界定义如下:

bit 1 to bit 2, bit 3- bit 6, 7-11, 12-13, 14-n

我使用以下代码将边界位转换为整数:

public int getNToKBits(int leftMostBit, int rightMostBit){
    int subBits = (((1 << leftMostBit) - 1) & (value >> (rightMostBit - 1)));
    return subBits;
}

但是当我尝试将4096拆分为这些边界时,我得到以下信息:

b: 00, 10, 10000, 0000, 00
d:  0,  2,    64,    0,  0 

-我知道,没有足够的位数来制作64位!!

我期望的是

b: 00, 10, 00000, 0000, 00
d:  0,  2,     0,    0,  0

它的预期数字小于4096。也许它改变了Java处理大于4096的数字的方式?

2 个答案:

答案 0 :(得分:0)

您可以定义如下内容:

public int subBits(int mask, int shift) {
    return (value & mask) >> shift;
}

然后使用哪种方式:

int[] bits = new int[5];

bits[0] = subBits(0b110000000000000, 13);
bits[1] = subBits(0b001100000000000, 11);
bits[2] = subBits(0b000011111000000, 6);
bits[3] = subBits(0b000000000111100, 2);
bits[4] = subBits(0b000000000000011, 0);

答案 1 :(得分:0)

对于您指定为7:11的字段:

(((1 << leftMostBit) - 1) & (value >> (rightMostBit - 1)))
 ((1 << 11) - 1)                                           = 11111111111 binary
                            (4096 >> (7-1))                =     1000000 binary
 ((1 << 11) - 1)          & (4096 >> (7-1))                =     1000000 binary 

这是因为您和实际的(即,右移的)字段位是从最左边的位数(11)计算出来的掩码,而不是字段中的位数(即11-7 + 1 = 5) 。

您需要先移位,然后再屏蔽为 size (不是最左边的位):

( (value>>(rightmost-1)) & ((1<<(leftmost-rightmost+1))) )
// or equivalently 
( ((1<<(leftmost-rightmost+1))) & (value>>(rightmost-1)) )

否则在移动前将其屏蔽到最左位:

( (value & ((1<<leftmost)-1)) >> (rightmost-1) )

在后一种情况下,如果您想要(能够)使用符号位(由您指定的32位),请使用>>>右移而不是>>