C 如何操作数组的单个位

C 如何操作数组的单个位,c,C,所以我定义了一个结构,在头中有一个无符号字符数组 #ifndef BITSTREAM_H #define BITSTREAM_H typedef struct { int lengthofarray; int position; unsigned char* arrayofunsignedchar; }Bitstream; #endif // INTARRAY_H 我在int main函数中创建了包含长度为8的数组的结构。并在create函数中将字段的所有位设置为0。但比特操作功能正是我努

所以我定义了一个结构,在头中有一个无符号字符数组

#ifndef BITSTREAM_H
#define BITSTREAM_H

typedef struct {
int lengthofarray;
int position;
unsigned char* arrayofunsignedchar;
}Bitstream;

#endif // INTARRAY_H
我在int main函数中创建了包含长度为8的数组的结构。并在create函数中将字段的所有位设置为0。但比特操作功能正是我努力的方向

int main(void)
{
Bitstream * bs = malloc(sizeof(Bitstream));
create(bs, &length);
destroy(bs);
bs = malloc(sizeof(Bitstream));
create(bs, &length);      
bitmanipulation(bs, 4, 4);
bitmanipulation(bs, 9, 27);

return EXIT_SUCCESS;
}
现在我想编写函数bitmanipulation,将这个数组的给定位数设置为给定值。我知道我必须使用按位and&或按位or |。但我不确定,例如,如何只处理第一个数组元素的最后3位。我想我必须将它按位与前5位为0的无符号整数进行比较,但是我不知道如何在函数中设计它,使其适用于每个给定的位数和值。如果有人能给我举个例子,说明如何操作数组元素的一部分位,那就太棒了

void bitmanipulation(Bitstream * bs, int numberofbits, int valueofbits){
//printf("%d position\n", (*bs).position);
//here should be the code to change the "numberofbits" bits before 
to be represent the valueofbits.
if((*bs).position == 0){
(*bs).position = (numberofbits-1);
}else {
(*bs).position = (*bs).position + numberofbits;
}
printf("%d position\n", (*bs).position);
printf("%d value of the element\n", (*bs).arrayofunsignedchar[0]);

}

bitmanipulation(bs, 4, 4);
// this should only manipulate the first 4 bits in the array 
arrayofunsignedchar and only set bit 2 to be 1. So Bit 0;1;3 would still
be 0 and they would be 0 from now on. And it updates the position to be 3;


bitmanipulation(bs, 9, 27);
//this now would have to manipulate bit 4 to bit 12; So It 
would set bit 4, bit 5, bit 7, bit 8; and bit 6;9;10;11;12 
would be 0 from now on. And it updates the position to be 12;
因此,它会将ArrayFunSigned字符视为一个位字段。在bitmanipulation的第一个函数调用之后,前4位将代表值4。然后,第二个f1function调用将处理位字段中接下来的9位。这个值代表27。比如说 位操作(bs,2,0)将什么也不做,因为位13和14已经是0了。如果我现在调用位操纵(bs,2,2),它会将位16更改为1,因此这两位“15”和“16”一起表示数字1

在上次调用bitmanipulation之后,我将打印由一行无符号整数表示的ArrayOfOnSignedChar。在这个例子中是

arrayofunsignedchar[0] = 180 (00101101)
arrayofunsignedchar[1] = 1 (10000000)
arrayofunsignedchar[2] = 1 (10000000)
所以打印输出是180;1.1.0;0;0;0;0.

考虑到 4是二进制的100,9是二进制的1001

 void bitmanipulation(Bitstream * bs, const int numberofbits, const int valueofbits) {
     int write=valueofbits;
     for(int i=0;i<numberofbits;++i) {
         if(write%2==1) { 
             // put 1 bit at position+i in bs->arrayofunsignedchar
         }else{
             // put 0 bit at position+i in bs->arrayofunsignedchar
         }
         write /= 2;
     }
     ...
 }

请注意不要超过阵列长度。

多亏了dvhh,我才能完成它

void bitmanipulation(Bitstream * bs, const int numberofbits, const int valueofbits) {
    int k = valueofbits;
    if ((*bs).position == 0) {
    printf("%d position\n", (*bs).position);
    }
    for (int i = 0; i <numberofbits; i++){
    if ((*bs).position > ((8*(*bs).lengthofarray)-1)){
    return;
    }
    if (k%2==1) {
    int charIndex = (*bs).position/8;
    int bitInCharIndex = (*bs).position%8;
    unsigned int input = 1;
    input <<= bitInCharIndex;
    (*bs).arrayofunsignedchar[charIndex] |= input;
    }
    k = k/2;
    (*bs).position = (*bs).position + 1;
    printf("%d position\n", (*bs).position);
    } 
    }

    void printthearray(Bitstream * bs){
    for (int i = 0; i < (*bs).lengthofarray; i++){
    unsigned char t = (*bs).arrayofunsignedchar[i];
    printf("%u ist das %dte Element des Arrays als Ganzzahl\n", t, i);
    }
    }

    int main(void)
    {
    Bitstream * bs = malloc(sizeof(Bitstream));
    create(bs, 10);
    destroy(bs);
    bs = malloc(sizeof(Bitstream));
    create(bs, 10);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    printthearray(bs);
    destroy(bs);

    return EXIT_SUCCESS;

    }

请举例说明样本输入、样本操作和所需输出;对于几个不同的输入和操作。谢谢你,我明天会尝试,但它看起来就像是我一直在寻找的。我明天试试,已经很晚了,很好,谢谢。我自己从来没有想过模循环。
void bitmanipulation(Bitstream * bs, const int numberofbits, const int valueofbits) {
    int k = valueofbits;
    if ((*bs).position == 0) {
    printf("%d position\n", (*bs).position);
    }
    for (int i = 0; i <numberofbits; i++){
    if ((*bs).position > ((8*(*bs).lengthofarray)-1)){
    return;
    }
    if (k%2==1) {
    int charIndex = (*bs).position/8;
    int bitInCharIndex = (*bs).position%8;
    unsigned int input = 1;
    input <<= bitInCharIndex;
    (*bs).arrayofunsignedchar[charIndex] |= input;
    }
    k = k/2;
    (*bs).position = (*bs).position + 1;
    printf("%d position\n", (*bs).position);
    } 
    }

    void printthearray(Bitstream * bs){
    for (int i = 0; i < (*bs).lengthofarray; i++){
    unsigned char t = (*bs).arrayofunsignedchar[i];
    printf("%u ist das %dte Element des Arrays als Ganzzahl\n", t, i);
    }
    }

    int main(void)
    {
    Bitstream * bs = malloc(sizeof(Bitstream));
    create(bs, 10);
    destroy(bs);
    bs = malloc(sizeof(Bitstream));
    create(bs, 10);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    bitmanipulation(bs, 4, 4);
    bitmanipulation(bs, 9, 27);
    bitmanipulation(bs, 6, 27);
    printthearray(bs);
    destroy(bs);

    return EXIT_SUCCESS;

    }
180 ist das 0te Element des Arrays als Ganzzahl 
// translated into English: 180 is the 0 element of the array 
// printed as an unsigned int.
97 ist das 1te Element des Arrays als Ganzzahl
163 ist das 2te Element des Arrays als Ganzzahl
13 ist das 3te Element des Arrays als Ganzzahl
27 ist das 4te Element des Arrays als Ganzzahl
109 ist das 5te Element des Arrays als Ganzzahl
216 ist das 6te Element des Arrays als Ganzzahl
104 ist das 7te Element des Arrays als Ganzzahl
195 ist das 8te Element des Arrays als Ganzzahl
70 ist das 9te Element des Arrays als Ganzzahl