2016-07-23 146 views
0

我有16位寄存器,它包含在LSBMSB一些值:获得值寄存器

LSB:
在位0 ... 1个的值是0
在比特2个的值是0

MBS:
在MSB我需要写值20

所以应该在寄存器写入的值是0 + 0 + 20 = 160

当我在读注册我做它是这样的:

对位的第1个值[0 ... 1]:

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

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

回答

1

在Java中,short是(签字)16-BI t值。要的是分成3个值:

  • 价值a是在0-1位的2位值
  • b处于位1位值2
  • c是一个13在比特3-15

逐位位值,可以表示如下:cccc cccc cccc cbaa

为了从16位提取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); 

这当然假定值是值范围,即内= 0-3,b = 0-1,并且c = 0-8191。

0

的问题有些东西不适合我不太清楚... 像:

在MSB我需要写值20

回到我的时代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.... 
+1

也许我解释了我的问题有点不对。正如我在第一篇文章中解释的那样,前3位是为某些值保留的。位[0 ... 1]的最大值为3,位2的值可以是0或1,第三个值可以在0和255之间。我的问题是如何存储第三个值并从寄存器读回? – Josef