首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java按位导致奇怪的结果

Java按位导致奇怪的结果
EN

Stack Overflow用户
提问于 2018-12-16 05:20:59
回答 2查看 98关注 0票数 0

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

我的代码运行得很好,直到我达到4096,在这一点上我的边界停止了行为。

我的边界定义如下:

代码语言:javascript
复制
bit 1 to bit 2, bit 3- bit 6, 7-11, 12-13, 14-n

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

代码语言:javascript
复制
public int getNToKBits(int leftMostBit, int rightMostBit){
    int subBits = (((1 << leftMostBit) - 1) & (value >> (rightMostBit - 1)));
    return subBits;
}

但是,当我尝试将数字4096分成这些边界时,我得到了以下结果:

代码语言:javascript
复制
b: 00, 10, 10000, 0000, 00
d:  0,  2,    64,    0,  0 

-I知道,没有足够的位数来表示64!!

我期望的是

代码语言:javascript
复制
b: 00, 10, 00000, 0000, 00
d:  0,  2,     0,    0,  0

正如预期的那样,它的数量小于4096。也许这是java处理大于4096的数字的方式的改变?

EN

回答 2

Stack Overflow用户

发布于 2018-12-16 08:51:36

你可以这样定义:

代码语言:javascript
复制
public int subBits(int mask, int shift) {
    return (value & mask) >> shift;
}

它的用法如下:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2018-12-16 14:24:01

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

代码语言:javascript
复制
(((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)。

您需要移位,然后掩码到大小(而不是最左边的位):

代码语言:javascript
复制
( (value>>(rightmost-1)) & ((1<<(leftmost-rightmost+1))) )
// or equivalently 
( ((1<<(leftmost-rightmost+1))) & (value>>(rightmost-1)) )

或者在移位之前掩码到最左边的位:

代码语言:javascript
复制
( (value & ((1<<leftmost)-1)) >> (rightmost-1) )

在后一种情况下,如果您想(能够)使用符号位(指定为32位),请使用>>>代替>>进行右移位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53797362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档