给定长度为
例子1:对于输入
去掉第一位后的输出应该是:
x
的uint8_t
缓冲区,我正在尝试编写一个函数或宏,以便可以删除第n位(或从n到n+i),然后左移剩余的位。例子1:对于输入
0b76543210 0b76543210 ...
,输出应为0b76543217 0b654321 ...
例子2:如果输入是:uint8_t input[8] = {
0b00110011,
0b00110011,
...
};
去掉第一位后的输出应该是:
uint8_t output[8] = {
0b00110010,
0b01100100,
...
};
我尝试过以下方法来删除第一个位,但对于第二组位没有起作用。
/* A macro to extract (a-b) range of bits without shifting */
#define BIT_RANGE(N,x,y) ((N) & ((0xff >> (7 - (y) + (x))) << ((x))))
void removeBit0(uint8_t *n) {
for (int i=0; i < 7; i++) {
n[i] = (BIT_RANGE(n[i], i + 1, 7)) << (i + 1) |
(BIT_RANGE(n[i + 1], 1, i + 1)) << (7 - i); /* This does not extract the next element bits */
}
n[7] = 0;
}
更新 #1
在我的情况下,输入将是 uint64_t 数字,然后我将使用
memmov
将其向左移动一位。
更新 #2 解决方案可以使用 C/C++、汇编语言(x86-64)或内联汇编语言。
pdep/pext
,由BMI2
指令集扩展添加。 - EOF