我需要在C中以最快的方式将112位(16字节)的7位值变量(它们以字节接收但MSb必须被丢弃)转换为14字节。
所以基本上,我需要做的是取第一个字节的前7位接收并将它们移到左边然后取第二个字节的第7位将它放在第一个字节中存储在位位置0所以我会在第一个字节中得到第一个字节的7位接收到第二个字节的第7位。然后我必须对其他人做同样的事情。
我能想到的第一种方式是:
byteToStore [0] = 1 << byteReceived[0] + byteReceived[1] & 1;
byteToStore [1] = 2 << byteReceived[1] + byteReceived[2] & 3;
byteToStore [2] = 3 << byteReceived[2] + byteReceived[3] & 7;
等等。
此外,如果可以使用for循环轻松制作它会很棒。我可以使用我的方法使用for循环,但它不会那么“干净”。
谢谢。
答案 0 :(得分:2)
您希望将相邻字节中的一些位打包成一个字节。这可以通过将左移左字节的最低7位与向右移位的右字节的最低7位组合来实现:
void pack(const uint8_t in[16], uint8_t out[14])
{
out[ 0] = (in[ 0] & 0x7f) << 1 | (in[ 1] & 0x7f) >> 6;
out[ 1] = (in[ 1] & 0x7f) << 2 | (in[ 2] & 0x7f) >> 5;
out[ 2] = (in[ 2] & 0x7f) << 3 | (in[ 3] & 0x7f) >> 4;
out[ 3] = (in[ 3] & 0x7f) << 4 | (in[ 4] & 0x7f) >> 3;
out[ 4] = (in[ 4] & 0x7f) << 5 | (in[ 5] & 0x7f) >> 2;
out[ 5] = (in[ 5] & 0x7f) << 6 | (in[ 6] & 0x7f) >> 1;
out[ 6] = (in[ 6] & 0x7f) << 7 | (in[ 7] & 0x7f) >> 0;
out[ 7] = (in[ 8] & 0x7f) << 1 | (in[ 9] & 0x7f) >> 6;
out[ 8] = (in[ 9] & 0x7f) << 2 | (in[10] & 0x7f) >> 5;
out[ 9] = (in[10] & 0x7f) << 3 | (in[11] & 0x7f) >> 4;
out[10] = (in[11] & 0x7f) << 4 | (in[12] & 0x7f) >> 3;
out[11] = (in[12] & 0x7f) << 5 | (in[13] & 0x7f) >> 2;
out[12] = (in[13] & 0x7f) << 6 | (in[14] & 0x7f) >> 1;
out[13] = (in[14] & 0x7f) << 7 | (in[15] & 0x7f) >> 0;
}
虽然每个块都有一个清晰的模式,但是在没有循环的情况下对它进行编码可能会更快,因为循环控制和移位算法不会花费任何时间。通过预先计算已删除所有最高有效位的辅助输入数组,可以加快代码速度,因此您不必为每个位提取最低7位(x & 0x7f
)两次。 (最后一次右移0没有做任何事情,但编译器会优化它。我保持它的对称性。)