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
代码在做什么,是根据给定的输入(size
、pos
)设置 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
数组中的四个值。
我目前正在处理按位运算,我找到了一种方法,其中引用 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
代码在做什么,是根据给定的输入(size
、pos
)设置 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
数组中的四个值。