我有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?
答案 0 :(得分:1)
在Java中,short
是(带符号的)16位值。您想将其拆分为3个值:
a
是位0-1 b
是位2中的1位值c
是位3-15 按位,可以这样表示: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....