从缓冲区中删除第n位,然后移动其余位

时间:2015-09-19 16:33:58

标签: c++ c bit-manipulation

uint8_tx长度的缓冲区,我试图找到一个可以删除第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)或内联汇编。

0 个答案:

没有答案