如何将unsigned long int(32位)分割成8个小块

How to split an unsigned long int (32 bit) into 8 nibbles?

本文关键字:分割 8个 32位 unsigned long int      更新时间:2023-10-16

如果我的问题让你感到困惑,我很抱歉但这是我想要做的例子,

假设我有一个unsigned long int = 1265985549在二进制中,我可以把它写成01001011011101010110100000001101

现在我想把这个32位二进制数分割成4位像这样分别处理这4位

0100 1011 0111 0101 0110 1000 0000 1101

您可以使用位操作获得位置k的4位蚕食,如下所示:

uint32_t nibble(uint32_t val, int k) {
    return (val >> (4*k)) & 0x0F;
}

现在你可以在一个循环中得到每个小块,像这样:

uint32_t val = 1265985549;
for (int k = 0; k != 8 ; k++) {
    uint32_t n = nibble(val, k);
    cout << n << endl;
}

short nibble0 = (i >>  0) & 15;
short nibble1 = (i >>  4) & 15;
short nibble2 = (i >>  8) & 15;
short nibble3 = (i >> 12) & 15;

根据解释其实际用法的注释,这里有另一种方法来计算有多少小块具有奇数奇偶校验:(未测试)

; compute parities of nibbles
x ^= x >> 2;
x ^= x >> 1;
x &= 0x11111111;
; add the parities
x = (x + (x >> 4)) & 0x0F0F0F0F;
int count = x * 0x01010101 >> 24;

第一部分只是一个常规的"xor all The bits"类型的奇偶校验计算(其中"all bits"指的是nibble中的所有位,而不是整个整数),第二部分是基于这个位计数算法,跳过一些不必要的步骤,因为某些位总是零,所以不需要添加。