我如何读取 9 位?
How i can read 9 bits?
我有文件。
我必须从文件中每 9 位读取一次并将其转换为 int 值。
我知道内存中的最小可寻址单元是 8 位,但我有类似的问题。
我该怎么做?
读取2个字节。获取第一个字节的所有位并将它们存储在一个 int 中(我们称之为 firstbyte
)。仅取第二个字节的第 1 位(即 1 或 0;我们称之为 extrabit
)。这必须附加到第一个字节的末尾(需要向左移动 1 以腾出空间)。
你需要的输出是:
output = (firstbyte << 1) + extrabit;
编辑,因为我没有正确阅读问题:边界每 8*9 = 72 位排列一次。在一个循环中,您可以将 9 个字节读入数组 input
,然后从中创建 8 个 9 位整数(在数组 output
中)。
你基本上是通过将我上面给出的代码推广到任何输入和输出数组来做到这一点的,就像这样:
/* in a loop */
// read 9 bytes into an array called input
// initialize an array output[8]
for (int i = 0; i<8; i++) {
output[i] = (input[i] << i + 1) + (input[i + 1] && (1 << (i + 1) - 1));
}
请注意,&& ~(1 << (7 - i) - 1)
是一个位掩码,它选择最高有效的 i + 1 位。
我有文件。 我必须从文件中每 9 位读取一次并将其转换为 int 值。 我知道内存中的最小可寻址单元是 8 位,但我有类似的问题。 我该怎么做?
读取2个字节。获取第一个字节的所有位并将它们存储在一个 int 中(我们称之为 firstbyte
)。仅取第二个字节的第 1 位(即 1 或 0;我们称之为 extrabit
)。这必须附加到第一个字节的末尾(需要向左移动 1 以腾出空间)。
你需要的输出是:
output = (firstbyte << 1) + extrabit;
编辑,因为我没有正确阅读问题:边界每 8*9 = 72 位排列一次。在一个循环中,您可以将 9 个字节读入数组 input
,然后从中创建 8 个 9 位整数(在数组 output
中)。
你基本上是通过将我上面给出的代码推广到任何输入和输出数组来做到这一点的,就像这样:
/* in a loop */
// read 9 bytes into an array called input
// initialize an array output[8]
for (int i = 0; i<8; i++) {
output[i] = (input[i] << i + 1) + (input[i + 1] && (1 << (i + 1) - 1));
}
请注意,&& ~(1 << (7 - i) - 1)
是一个位掩码,它选择最高有效的 i + 1 位。