我正在尝试使用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的数字的方式?
答案 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位),请使用>>>
右移而不是>>
。