首页 > 解决方案 > 在 uint8_t 块的特定索引处添加位

问题描述

所以我有一个指向uint8_t数组的指针,格式如下:

uint8_t* array; // 64-bit array

我需要通过将位向右移动并在 2 的幂的索引处插入位 0 或 1 来修改此数组。从而生成一个 72 位数组。

uint8_t newArr[9];

修改数组的最佳方法是什么,以便我可以在我计算的特定位置添加位。我想将数组转换为 aa char 数组,然后逐位添加。但是,有没有比这更快更简单的方法。

因此,如果我有一个指向位数组的指针,格式uint8_t如下:

000100001 11001111 01101101 11000001 11100000 00101111 11111001 10010010

我需要将其修改为一个uint8_t[9]数组,以便在新数组的 0、1、2、4、8、16、32、64 处插入我指定的位,如下所示:(答案错误)

00000000 11001111 11001111 11001111 11001111 01101101 01101101 10010010 00100001

但我不知道如何在不移动所有位的情况下将特定位向右移动。例如,如果我将从索引 2 1 开始的所有位向右移动,然后从索引 4 开始的所有位向右移动 1。

标签: cbit-manipulationbitwise-operators

解决方案


假设您从以下内容开始:

src[0]   src[1]   src[2]   src[3]   src[4]   src[5]   src[6]   src[7]
-------- -------- -------- -------- -------- -------- -------- --------
       7        6        5        4        3        2        1
76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210
aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffff gggggggg hhhhhhhh

您要在以下位置(八进制)插入:0、1、2、4、10、20、40、100

这意味着您需要以下内容:

dst[0]   dst[1]   dst[2]   dst[3]   dst[4]   dst[5]   dst[6]   dst[7]   dst[8]
-------- -------- -------- -------- -------- -------- -------- -------- --------
       1
       0        7        6        5        4        3        2        1
76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210
aaaaaaa0 abbbbbbb bccccccc cddddddd deeeeee0 eeffffff ffggggg0 ggghhhh0 hhh0h000

所以,

dst[0] = src[0] & 0xFE;
dst[1] = ((src[0]       ) << 7) | ((src[1]       ) >> 1);
dst[2] = ((src[1]       ) << 7) | ((src[2]       ) >> 1);
dst[3] = ((src[2]       ) << 7) | ((src[3]       ) >> 1);
dst[4] = ((src[3]       ) << 7) | ((src[4] & 0xFC) >> 1);
dst[5] = ((src[4]       ) << 6) | ((src[5]       ) >> 2);
dst[6] = ((src[5]       ) << 6) | ((src[6] & 0xFC) >> 2);
dst[7] = ((src[6]       ) << 5) | ((src[7] & 0xFC) >> 3);
dst[8] = ((src[7] & 0x0E) << 5) | ((src[7] & 0x01) << 3);

(无用的面具省略。)


推荐阅读