如何将unsigned long int(32位)拆分为8个半字节?

时间:2014-05-07 13:58:37

标签: c++ binary bit-manipulation bitwise-operators

如果我的问题令人困惑,我很抱歉,但这是我想要做的例子,

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

现在我想将这个二进制32位数分成这样的4位,并分别在这4位

上工作

0100 1011 0111 0101 0110 1000 0000 1101

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

您可以使用位操作在位置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;
}

Demo on ideone.

答案 1 :(得分:3)

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

答案 2 :(得分:1)

基于解释实际用途的评论,这里是另一种计算有多少半字节具有奇数奇偶校验的方法:(未测试)

; 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 bits”类型的奇偶校验计算(其中“所有位”指的是半字节中的所有位,而不是整个整数),第二部分基于{{ 3}},跳过一些不必要的步骤,因为某些位总是为零,因此不必添加。