我正在尝试使用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 -I知道,没有足够的位数来表示64!!
我期望的是
b: 00, 10, 00000, 0000, 00
d: 0, 2, 0, 0, 0正如预期的那样,它的数量小于4096。也许这是java处理大于4096的数字的方式的改变?
发布于 2018-12-16 08:51:36
你可以这样定义:
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);发布于 2018-12-16 14:24:01
对于指定为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)。
您需要移位,然后掩码到大小(而不是最左边的位):
( (value>>(rightmost-1)) & ((1<<(leftmost-rightmost+1))) )
// or equivalently
( ((1<<(leftmost-rightmost+1))) & (value>>(rightmost-1)) )或者在移位之前掩码到最左边的位:
( (value & ((1<<leftmost)-1)) >> (rightmost-1) )在后一种情况下,如果您想(能够)使用符号位(指定为32位),请使用>>>代替>>进行右移位。
https://stackoverflow.com/questions/53797362
复制相似问题