2016-07-23 112 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