如果我的问题令人困惑,我很抱歉,但这是我想要做的例子,
假设我有一个unsigned long int = 1265985549 在二进制中我可以写为01001011011101010110100000001101
现在我想将这个二进制32位数分成这样的4位,并分别在这4位
上工作0100 1011 0111 0101 0110 1000 0000 1101
任何帮助将不胜感激。
答案 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;
}
答案 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}},跳过一些不必要的步骤,因为某些位总是为零,因此不必添加。