C++ 如何将无符号长整数(32位)拆分为8个半字节?

C++ 如何将无符号长整数(32位)拆分为8个半字节?,c++,binary,bit-manipulation,bitwise-operators,C++,Binary,Bit Manipulation,Bitwise Operators,如果我的问题令人困惑,我很抱歉,但下面是我想做的示例 假设我有一个无符号长int=1265985549 在二进制中,我可以将其写成01001011011101010110100000001101 现在我想把这个二进制32位数字分成4位,像这样,分别处理这4位 0100 1011 0111 0101 0110 1000 0000 1101 非常感谢您的帮助。您可以使用位操作在位置k获得4位半字节,如下所示: uint32_t nibble(uint32_t val, int k) { re

如果我的问题令人困惑,我很抱歉,但下面是我想做的示例

假设我有一个无符号长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;
}
现在,您可以在一个循环中获取各个半字节,如下所示:

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;
}
uint32\u t val=1265985549;
for(int k=0;k!=8;k++){
uint32_t n=半字节(val,k);
库特

etc

根据解释实际使用的注释,这里有另一种方法来计算奇数奇偶校验的字节数:(未测试)


第一部分只是常规的“异或所有位”奇偶校验计算类型(其中“所有位”指的是半字节中的所有位,而不是整个整数)第二部分是基于跳过一些不必要的步骤,因为某些位总是零,所以不必添加。

C++解决方案是使用<代码> STD::BITSET ,然后移动并屏蔽小写。你能更具体地说明你想用小写什么吗?通常用位操作。没有必要将内容拆分为字段,它们已经隐式细分为单独的位-只是不要做任何可以将信息从一个字段传输到另一个字段的事情。我正在检查一个半字节中的1的数量,然后如果它是奇数,我将1添加到变量中,如果它是偶数,我将0添加到另一个8位数字。@Astronautilus很好,这是一个不需要提取半字节的例子。我更喜欢使用
0x0F
来更明确地说明位掩蔽。@Jarod42:我会说
std::uint32\u t val
。这是唯一可以确定的方法。只需补充一下,OP就可以以二进制形式打印半字节(看起来像是需要的)通过使用
#include
是否可以反转您的半字节…:D