读取Java中32位无符号整数的位值

时间:2013-12-03 17:26:52

标签: java integer bit

我试图在Java中读取Integer中的位值。我正在读取硬件设备的状态,说明它返回:

标题(4个字节): 1B + FF + 02 + m 其中m是m之后的状态数据的字节数。字节3应该定义状态包的类型。

状态摘要(4个字节): 状态摘要的32位中的每一位都可用作以下用途的标志,请注意,这是一个32位无符号整数。每个位(0-31)大多为0或1。

当我从USB设备读取状态时,它通常返回“18”。所以我尝试了这样的功能:

status_printer_error = getBit(status,0);
public int getBit(int n, int k) {
    return (n >> k) & 1;
}

这似乎不起作用。我也试过循环遍历所有位:

for (int i = 31; i >= 0; i--) {
            int s = status_sum & (1 << i);
            Log.d(TAG,"bit: " + s);
        }

但结果似乎不对,我得到0,2,0,0,16,0,0 ......等等(全部为0)。

以下是该设备的PDF文档。打印功能对我来说都很有用,它只是我正在努力的状态部分(第51页): https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.hengstler.com%2Fgfx%2Ffile%2Fshop%2Fprinter%2FeXtendo_X-80%2FD-684-112_EmulationCommandSetReference_eXtendo-E-V1_07.pdf&ei=8BaeUuLII5H3oASAxoLQDw&usg=AFQjCNF6iwxBwDsotnKUYmeWwis6ZIqX2w&bvm=bv.57155469,d.cGU

2 个答案:

答案 0 :(得分:2)

我根本不会将其视为int。原因是您的数据以字节形式出现,您将其转换为int,然后将int解码回字节。

我会在你得到它时解析每个字节。但是在回答您的问题时,我会将int值打印为带Integer.toHexString(status)的十六进制,以确保您的int按照您的预期编写。您的18作为int值似乎是错误的,因此尝试将其转换为位将不会使其更正确。

我要检查的第一件事是你没有这样做。

int i = inputStream.read(); // is 8-bit not 32-bit.

返回int值,但它是一个8位的int值,而不是32位的int值。

答案 1 :(得分:0)

事实证明,硬件设备api上的方法只返回长度并解析其中一个参数返回了我需要的所有细节。所以

public int getBit(int n, int k) {
    return (n >> k) & 1;
}

在给出正确的int时工作。