给uint8_t
个x
长度的缓冲区,我试图找到一个可以删除第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;
}
lme4 issue
更新#1
在我的情况下,输入将是uint64_t数字,然后我将使用memmov
将其向左移动一个位置。
更新#2 解决方案可以是C / C ++,汇编(x86-64)或内联汇编。