从 16 位寄存器的 MSB 获取值

Getting value from MSB of 16 bit register

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

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

但是如何read/convert第三个值得到20呢?

问题中有些东西我不是很清楚... 喜欢:

At MSB I need to write value 20

在我那个时代,MSB 只有 1 位,只能写 true 或 false...

总之...

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....

在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。