gpt4 book ai didi

c - 在十六进制数组中写入位

转载 作者:行者123 更新时间:2023-11-30 18:11:03 25 4
gpt4 key购买 nike

如果标题有误导性,我很抱歉,但我真的想不出更好的标题。

我这里有这个数组:

unsigned int container[] = {0xAAAAAABB, 0xBBBBCCCC, 0xCCDDDDDD};

我有这个值:

0x444555

我有这个位置(位):

24

现在,位置 24 将指向第一个 B 所在的位置。我需要实现这个功能:

void write_bits(unsigned int container[], int index, unsigned int value)

使用我之前给出的参数,会将数组更改为:

unsigned int container[] = {0xAAAAAA44, 0x4555CCCC, 0xCCDDDDDD};

我首先尝试的是通过移位操作来操纵位,以便我可以清理要插入的值的空间:

void write_bits(unsigned int container[], int index, unsigned int value) {
int size_of_value = 24;

int shift_first = sizeof(int) * CHAR_BIT - index;
int shift_second = size_of_value - shift_first;

int cont_idx = index / (sizeof(int) * CHAR_BIT);

vector[cont_idx] = vector[cont_idx] >> shift_first;
vector[cont_idx] = vector[cont_idx] << shift_first;
vector[cont_idx+1] = vector[cont_idx+1] << shift_second;
vector[cont_idx+1] = vector[cont_idx+1] >> shift_second;

}

使用前面给出的参数,这将给我:

container[] = {0xAAAAAA00, 0x0000CCCC, 0xCCDDDDDD};

问题是,如果我使用位置 0 或 4,它将不起作用。另外,我无法在 0 所在的位置插入 0x444555。

最佳答案

遵循您的逻辑有点尴尬,但是在清除第一个元素中的最低有效位并清除下一个元素中的最高有效位以为您希望设置的位让路后,您需要做的就是< em>shift 和 OR 你的替换位来替换你刚刚清除的位。

例如,使用您的逻辑(稍微更改变量名称,以明确您是在元素中的最低还是最高有效位上进行操作) ,您可以执行以下操作:

void write_bits (unsigned *a, int off, unsigned v)
{
int elembits = (int)(sizeof *a) * CHAR_BIT, /* bits per element */
lsbits = elembits - off, /* lsb bits in current */
msbits = off - lsbits, /* msb bits in next */
cont_idx = off / (sizeof *a * CHAR_BIT);/* current index */

a[cont_idx] = a[cont_idx] >> lsbits; /* clear lsits in current */
a[cont_idx] = a[cont_idx] << lsbits;
a[cont_idx] |= (v >> msbits); /* set lsbits in current */

cont_idx++; /* advance to next element */

a[cont_idx] = a[cont_idx] << msbits; /* clear msbits in current */
a[cont_idx] = a[cont_idx] >> msbits;
a[cont_idx] |= ((v >> lsbits) << msbits); /* set msbits in current */
}

(注意:您需要仔细查看确定 cont_idx 的逻辑,并测试您要替换的位数是否会超过 sizeof (无符号) 字节影响两个以上的元素,或者要替换的位是否全部落入单个元素中 - 这由您决定)

使用您的测试用例将其放在一个简短的示例中,您可以这样做:

#include <stdio.h>
#include <limits.h>

void write_bits (unsigned *a, int off, unsigned v)
{
int elembits = (int)(sizeof *a) * CHAR_BIT, /* bits per element */
lsbits = elembits - off, /* lsb bits in current */
msbits = off - lsbits, /* msb bits in next */
cont_idx = off / (sizeof *a * CHAR_BIT);/* current index */

a[cont_idx] = a[cont_idx] >> lsbits; /* clear lsits in current */
a[cont_idx] = a[cont_idx] << lsbits;
a[cont_idx] |= (v >> msbits); /* set lsbits in current */

cont_idx++; /* advance to next element */

a[cont_idx] = a[cont_idx] << msbits; /* clear msbits in current */
a[cont_idx] = a[cont_idx] >> msbits;
a[cont_idx] |= ((v >> lsbits) << msbits); /* set msbits in current */
}

int main (void) {

unsigned container[] = {0xAAAAAABB, 0xBBBBCCCC, 0xCCDDDDDD},
n = sizeof container / sizeof *container,
v = 0x444555;

write_bits (container, 24, v);

fputs ("unsigned container[] = {", stdout);
for (unsigned i = 0; i < n; i++)
printf (i ? ", 0x%08X" : "0x%08X", container[i]);
puts ("};");
}

示例使用/输出

$ ./bin/arr-write-bits
unsigned container[] = {0xAAAAAA44, 0x4555CCCC, 0xCCDDDDDD};

关于c - 在十六进制数组中写入位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52571434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com