【发布时间】:2016-06-16 14:14:17
【问题描述】:
我正在尝试用一些二进制 1 将一个 unsigned char 数组向右移动。
示例:0000 0000 | 0000 1111 我换 8 次会给我 0000 1111 | 1111 1111(二进制左移)
所以在我的数组中我会得到:{0x0F, 0x00, 0x00, 0x00} => {0xFF, 0x0F, 0x00, 0x00}(数组中的右移)
我目前使用函数 memmove:
unsigned char * dataBuffer = {0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned int shift = 4;
unsigned length = 8;
memmove(dataBuffer, dataBuffer - shift, length + shift);
for(int i = 0 ; i < 8 ; i++) printf("0x%X ", dataBuffer[i]);
Output: 0x0 0x0 0x0 0x0 0xF 0x0 0x0 0x0
Expected output: 0xFF 0x0 0x0 0x0 0x0 0x0 0x0 0x0
如您所见,我设法仅逐个元素地移动我的数组,我不知道如何将 0 替换为 1。我想使用 memset 可以工作,但我无法正确使用它。
感谢您的帮助!
编辑:这是为了填充 exFAT 磁盘的位图区域。在磁盘中写入簇时,必须将位图的相应位设置为 1(第一个簇为第一位,第二个簇为第二位,...)。
新格式化的驱动器将在位图的第一个字节中包含 0x0F,因此如果我编写 8 个簇,建议的示例符合我的需要,我需要将值移动 8 次并用 1 填充。
在代码中,我写了 4 个簇,需要将值移动 4 位,但它移动了 4 个字节。
将问题设置为已解决,不可能做我想做的事。我需要分别移动数组的每个字节,而不是移动数组的位。
【问题讨论】:
-
对于这类问题最好把问题说清楚。它们看起来像什么 - 输入和输出?究竟是什么预期的行为?你举了一个例子,但这真的能满足你的要求吗?你需要那个干什么?
-
这是为了填充 exFAT 磁盘的位图区域。在磁盘中写入簇时,必须将位图的相应位设置为 1(第一个簇为第一位,第二个簇为第二位,...)。新格式化的驱动器将在位图的第一个字节中包含 0x0F,因此如果我编写 8 个集群,建议的示例符合我的需要,我需要将值移动 8 次并用 1 填充。
-
移位在这里没有意义 - 首先,您选择写入哪些集群,这根本不涉及移位,只需设置与您正在编写的集群相对应的位(它们无论如何可能不连续)。其次,您的示例表明您正在向右移动,但使用 1 而不是 0 填充,这与正常位移相反。要进行位移,您可以使用 > 位级运算符来执行此操作,自己管理用于位移的任何字长的溢出。但是,根据您的描述,这听起来不像您真正想要的。
-
@ArthurPenguin 您能否先检查以下链接是否回答了您的问题? stackoverflow.com/a/47990/1566187