C 中的按位运算符,指的是 8 位数组中的位置

Bitwise operation in C, referring to a position in an 8bit array

我目前正在处理按位运算,我找到了一种方法,其中引用 8 位数组中的位置对我来说不是很清楚。

这里有一个例子,数字都是我随机选择的,只是为了说明,方法本身要复杂得多(数组可以初始化为任何足够大的大小):

void method(int pos, uint8_t* array_of_num) {

  int dim = 5;
  uint8_t numbers[4] = {1, 8, 32, 64}; 

  int size = 10;
  int i = 0;
  for (i=0; i < size; i++){

     array_of_num[pos + i/4] |= numbers[i%4];   // <======
  }

}  

不明白,"array_of_num[pos + i/4]"指的是哪个位置。 array_of_num 是一个 8 位 uint 数组,所以它看起来像这样:

[0] ----> 1 (00000001); 
[1] ----> 5 (00000101); 
[2] ----> ......  

它是指数组中某个位置的某些位,但如果是, --|-- 操作数怎么可能只考虑这些位,因为数字[]也是8位uint。让我试着解释一下这个例子的意思,所以:

pos = 0; i = 1
array_of_num[0 + 1/4] |= 00001000 

如果我们只写是不是一样:

array_of_num[0] |= 00001000

代码在做什么,是根据给定的输入(sizepos)设置 array_of_num 数组中的位。

使用当前值,它从 pos 的 8 位值开始,设置位 0、3、5 和 6,然后移动到下一个并做同样的事情,并为它设置的第三个值位 0 和 3.

写成:

array_of_num[pos] | = 1;
array_of_num[pos] | = 8;
array_of_num[pos] | = 32;
array_of_num[pos] | = 64;
array_of_num[pos+1] | = 1;
array_of_num[pos+1] | = 8;
array_of_num[pos+1] | = 32;
array_of_num[pos+1] | = 64;
array_of_num[pos+2] | = 1;
array_of_num[pos+2] | = 8;

所以本质上它是这样做的:

array_of_num[pos] |= (1|8|32|64);
array_of_num[pos+1] |= (1|8|32|64);
array_of_num[pos+2] |= (1|8);

当然i = 0; array_of_num[0 + i/4]array_of_num[0]是一样的,但是i=6就完全不一样了。除数用于使四个或操作在单个字节上工作。模数仅用于指向 numbers 数组中的四个值。