c - 在 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。
解决方案
假设您从以下内容开始:
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);
(无用的面具省略。)
推荐阅读
- ios - 如何在 iOS 10+ 中更换设备旋转的渐变背景
- c++-winrt - 如何返回数组 asyc,在 C++/WinRT 中编写 Windows 运行时组件
- android - ARCore 非常不稳定地检测图像
- python - 如何用特殊字符python替换字符串列表中的完全匹配?
- python - 带有容差参数的 Pandas merge_asof 失败
- laravel - Eloquent ORM 获取最新项目查询
- sql-server - 将具有多个联系人的帐户显示为单独的列而不是行?
- android - Android后退按钮的用途,是确定还是取消?
- khan-academy - 如何通过可汗学院 API 选择视频中的语言?
- kubernetes - GKE 集群内 DNS 解析停止工作