Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将4个2位值合并为1个8位值?_C++_C_Bit Manipulation_Bit_Bit Shift - Fatal编程技术网

C++ 如何将4个2位值合并为1个8位值?

C++ 如何将4个2位值合并为1个8位值?,c++,c,bit-manipulation,bit,bit-shift,C++,C,Bit Manipulation,Bit,Bit Shift,这段代码就是我用来将4个2位值(无符号字符,但它们只包含0-3的值)组合成1个无符号字符值的代码 unsigned char nibble = 0; nibble = (nibble & 0x03) | (output[i] & 0x03); nibble = (nibble & 0x0C) | (output[i+1] & 0x03) << 2); nibble = (nibble & 0x30) | (output[i+2] &

这段代码就是我用来将4个2位值(无符号字符,但它们只包含0-3的值)组合成1个无符号字符值的代码

unsigned char nibble = 0;

nibble = (nibble & 0x03) | (output[i] & 0x03);
nibble = (nibble & 0x0C) | (output[i+1] & 0x03) << 2);
nibble = (nibble & 0x30) | (output[i+2] & 0x03) << 4);
nibble = (nibble & 0xC0) | (output[i+3] & 0x03) << 6);
无符号字符半字节=0;
半字节=(半字节&0x03)|(输出[i]&0x03);

半字节=(半字节&0x0C)|(输出[i+1]&0x03)这是因为每次都清除半字节中的位

也就是说,当你这么说的时候:

nibble = (nibble & 0xC0)
你真正想说的是“扔掉我到目前为止所做的所有工作,除了位置3和4的部分”

此代码(未经测试)可能会解决您的问题:

unsigned char nibble = 0;

nibble |= (output[i  ] & 0x03);
nibble |= (output[i+1] & 0x03) << 2;
nibble |= (output[i+2] & 0x03) << 4;
nibble |= (output[i+3] & 0x03) << 6;

当然,如果你真的非常确定的话,这些资产可以被删除。但是您也可以将它们保留在中,并让编译器使用
NDEBUG
标志(
g++-DNDEBUG mycode.cpp
)来删除它们。请参阅以了解更多详细信息。

这是因为您每次都清除半字节中的位

也就是说,当你这么说的时候:

nibble = (nibble & 0xC0)
你真正想说的是“扔掉我到目前为止所做的所有工作,除了位置3和4的部分”

此代码(未经测试)可能会解决您的问题:

unsigned char nibble = 0;

nibble |= (output[i  ] & 0x03);
nibble |= (output[i+1] & 0x03) << 2;
nibble |= (output[i+2] & 0x03) << 4;
nibble |= (output[i+3] & 0x03) << 6;

当然,如果你真的非常确定的话,这些资产可以被删除。但是您也可以将它们保留在中,并让编译器使用
NDEBUG
标志(
g++-DNDEBUG mycode.cpp
)来删除它们。请参阅以了解更多详细信息。

这是因为在使用新位填充
半字节之前,您正在使用一个掩码对其进行过滤,如果有任何操作与它应该执行的操作相反

nibble = (nibble & 0x03) | (output[i] & 0x03);
nibble = (nibble & 0x0C) | (output[i+1] & 0x03) << 2);
nibble = (nibble & 0x30) | (output[i+2] & 0x03) << 4);
nibble = (nibble & 0xC0) | (output[i+3] & 0x03) << 6);
                   ^^^^ in here you preserve the bits
             you want to replace and zero out everything else
nibble=(nibble&0x03)|(输出[i]&0x03);

半字节=(半字节&0x0C)|(输出[i+1]&0x03)这是因为在用新位填充
半字节之前,您正在使用一个掩码对其进行过滤,如果有任何操作与它应该做的相反

nibble = (nibble & 0x03) | (output[i] & 0x03);
nibble = (nibble & 0x0C) | (output[i+1] & 0x03) << 2);
nibble = (nibble & 0x30) | (output[i+2] & 0x03) << 4);
nibble = (nibble & 0xC0) | (output[i+3] & 0x03) << 6);
                   ^^^^ in here you preserve the bits
             you want to replace and zero out everything else
nibble=(nibble&0x03)|(输出[i]&0x03);

nibble=(nibble&0x0C)|(output[i+1]&0x03)就个人而言,我不会费心去做掩码的事情,只需直接添加值。代码更大,但如果没有进行大量优化的编译器,则速度更快。第一行:
nibble |=输出[i]第二行:
nibble就个人而言,我不会费心去做屏蔽的事情,而只是直接添加值。代码更大,但如果没有进行大量优化的编译器,则速度更快。第一行:
nibble |=输出[i]第二行:
nibble如果保证OP的语句
(无符号字符,但它们只保存0-3的值)
,则可以省略
&0x03
的4个实例。如果保证OP的语句
(无符号字符,但它们只保存0-3的值)
,则可以省略
&0x03
的4个实例。