从16位寄存器的MSB获取值

时间:2016-07-23 10:18:37

标签: java bit-shift cpu-registers bits

我有16位寄存器,其中包含 LSB MSB 中的一些值:

LSB:
在位0 ... 1处,该值为0
在第2位,值为0

MBS:
在MSB,我需要写入值20

因此应该在寄存器中写入的值是0 + 0 + 20 = 160

当我正在阅读时,我正在这样做:

表示位[0 ... 1]中的第一个值:

firstVal = (valFromReg & (((1 << 2)-1) << 1) / 2)  
secondVal = (valFromReg & 4) / 4

但如何读取/转换第三个值以获得数字20?

2 个答案:

答案 0 :(得分:1)

在Java中,short是(带符号的)16位值。您想将其拆分为3个值:

  • a是位0-1
  • 中的2位值
  • b是位2中的1位值
  • c是位3-15
  • 中的13位值

按位,可以这样表示:cccc cccc cccc cbaa

要从16位reg值中提取3个值,您可以这样做:

short reg = /*register value*/;
int a = reg & 0x0003;
int b = (reg >> 2) & 0x0001;
int c = (reg >> 3) & 0x1fff;

换句话说,你会这样做:

short reg = (short)((c << 3) | (b << 2) | a);

这当然假设值在值范围内,即a = 0-3,b = 0-1,c = 0-8191。

答案 1 :(得分:0)

问题中的一些事情对我来说并不十分清楚...... 像:

  

在MSB,我需要写入值

回到我的时代MSB只有1位,只能写真或假...

反正...

16位信号非常适合整数... 因此你基本上可以获得该寄存器并将其作为一个整数进行操作,然后将其表示为二进制数 AS STRING 将允许您获得 MSB 甚至是任何位置想要的位置......

这样做:

实施例

int register = -128;
String foo = String.format("%16s", Integer.toBinaryString(register)).replace(' ', '0');
System.out.println(register);
System.out.println(foo);
System.out.println(foo.charAt(0));  //char at 0 is the MSB....