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

时间:2014-01-20 18:00:37

标签: c arrays bit-manipulation

我有一个函数我正试图写下面的形式(并没有找到我正在寻找的东西 - 如果这是一个重复,请指出我在正确的地方 - 即使它不是{ {1}}和int s,但是,比方说,shortchar代替,这样会很好):

int

我在put_bits(short *array_of_short, int significant_bits, int bit_offset, int integer_to_append) 的{​​{1}}覆盖significant_bits的{​​{1}}。

我想通过覆盖(或按位oring,或覆盖或替换)位到数组中的位置来完成任务(我不想向数组中添加更多元素或分配更多内存) - 也就是说,它应该很容易,但效率很低,只需跟踪偏移量转换为数组的元素数量,是否落在短路的边界上,并将整数的位移到适当的偏移量,或者它们在合适的短线上 - 但这看起来像负载的开销和计算超过我需要的比较只是将比特放到适当的位置,但我有点不知所措......

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

integer_to_append

bit_offset

我希望在任意点将{(1)}的任意大小的数组叠加(或按位或此)。所以,如果我有

整数:

array_of_short

简短的数组:

0000 0000 0000 0000 0000 0000 0000 0000

我想在第42位追加:

0000 0000 0000 0000 0000 0000 0011 1111

如果我完全离开或者我没有意义,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你实际上想把你的数组视为比特数组。当然,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]
}