从 16 位寄存器的 MSB 获取值
Getting value from MSB of 16 bit register
我有 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
但是如何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。
我有 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
但是如何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。