c - 如何用整数中的任意位替换/覆盖短数组中任意位置的任意数量的位

标签 c arrays bit-manipulation

我有一个正在尝试编写以下形式的函数(并且还没有找到我正在寻找的确切内容 - 如果这是一个重复,请指出我在正确的位置 - 即使它不是 ints 和 shorts,但是,比如说,chars 和 ints,那就没问题了):

put_bits(short *array_of_short, int significant_bits, int bit_offset, int integer_to_append)

我在 array_of_short 中的 bit_offset 处覆盖 integer_to_appendsignificant_bits

我想通过仅覆盖(或按位或运算、或覆盖或替换)位到数组中的位置来完成任务(我不想向数组添加更多元素或分配更多内存)-即,应该很容易,但效率很低,只跟踪偏移量转换为数组中的多少个元素,无论它是否落在短裤的边界上,并将整数的位移动到适当的偏移量和/或它们到适当的短路上 - 但这似乎是大量的开销和计算比我需要的更多,而只是将这些位插入到适当的位置,但我有点不知所措......

例如,我有一个整数,它将包含任意数量的“有效”位 - 假设这个例子有 6 个。所以值从 0 到 63

0000 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0000 0011 1111

我想在任意点将其覆盖(或按位或此)到任意大小的 short 数组。所以如果我有

整数:

0000 0000 0000 0000 0000 0000 0010 0001

短数组:

0100 1000 0100 1100 : 1100 0010 0110 0000 : 0000 0000 0000 0000 : 0000 0000 0000 0000

我想在位置 42 处追加以获得:

0100 1000 0100 1100 : 1100 0010 0110 0000 : 0000 0000 0000 1000 : 0100 0000 0000 0000

如果我完全不明白或者我没有道理,也请告诉我。

最佳答案

如果我正确理解你的问题,你实际上想将你的数组视为位数组。当然,c中没有位数组这样的结构,但是你可以实现它。 Here是以 int 作为基本类型的位数组的示例。您可以采用这种解决方案,以 Short 作为基本类型,然后一点一点地设置如下:

for( i = 0 ; i< sizeof(int)*8;++i)
{
       unsigned int flag = 1;
       flag = flag << i;
       if( int_num & flag)
           SetBit( array_of_short, bit_offset + i ); 
}

void  SetBit( short array_of_short[ ],  int k )
{
   array_of_short[k/16] |= 1 << (k%16);  // Set the bit at the k-th position in  array_of_short[i]
}

关于c - 如何用整数中的任意位替换/覆盖短数组中任意位置的任意数量的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21241007/

相关文章:

java - 跳过空数组

c - 合并十六进制值中的位

javascript - 与非门是如何实现的? (概念上)

mysql_init(NULL) 段错误

C从XML中提取数据

c - C中存储字符串的指针数组

javascript - JS中如何使用findIndex()查找所选项目的索引?

javascript - JavaScript 中对象的 Array.prototype.map() 等价物是什么

java - Java 类 Integer 和 Long 的源代码中的 "HD"是什么意思?

c++ - 如何在 visual studio 2017 中使用 zlib 库?