困难的公式

时间:2015-08-17 15:56:22

标签: java math bit bitwise-operators

我是字节和位的新手,我在数学方面也不是很好。我有点理解按位运算符,但我不知道如何用2个变量求解数学方程式/公式。我不确定这是问题的适当地方,但无论如何。

我有这样的公式:

(Adr_MSB & 0x3F) << (8 + Adr_LSB)

现在我想要的是我会得到一个整数(例如33),代码会将其转换为Adr_MSB和Adr_LSB(它们是字节)。 它应该可以达到128(好吧我猜它会是127)。

我知道这个问题可能听起来很愚蠢,但我只是不知道足够的数学来解决这个问题。

感谢您的帮助。

编辑:通过实验我发现,Adr_MSB是一个乘数(例如,如果它的结果​​是10倍,则比它的1倍)。

3 个答案:

答案 0 :(得分:1)

据我理解

  • (Adr_MSB & 0x3F)部分取Adr_MSB的最后六位并返回相应的整数。
    • 例如:125(1111101)将返回61(111101)
    • 注意:此步骤除去最后6位以外的所有位,这些位丢失。因此无法实现无损反函数。
  • (8 + Adr_LSB)只增加8 Adr_LSB
  • <<是一个有点明智的左移算子。
    • EG。 61 << 3 = 488。由于61是111101,向右添加三个零(左移三次)将得到111101000,即488。

要应用于给定数字(Adr_MSB & 0x3F) << (8 + Adr_LSB)

的表达式x的有效反转
  1. x取前六位并将其转换为int。这将是Adr_MSB
  2. 计算其余的位数。从此计数中减去8,它将为Adr_LSB

答案 1 :(得分:0)

以下是否代表您所寻找的内容?

((Adr_MSB&amp; 0x3F)&lt;&lt; 8)| Adr_LSB

答案 2 :(得分:0)

这会有用吗?

int x = 33;
byte Adr_MSB = (byte)x;
byte Adr_LSB = (byte)24;
System.out.println((Adr_MSB & 0x3F) << (8 + Adr_LSB));

Adr_LSB也可以是-8。

由于您在Adr_MSB和111111上进行按位AND,因此您只有六个连续位可用于表示数字,因此并非所有整数都可以通过移位这6位来表示。这个解决方案适用于x到enter image description here,所以...你可以说这不是一个好的解决方案,但它是一个开始。