【发布时间】:2017-08-10 01:52:49
【问题描述】:
此代码是我用来将 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);
它会为除 00 00 00 00 之外的所有内容生成不正确的值(它通常会为 2 组不同的 2 位值生成相同的结果)。
我很困惑,因为上面的代码是 this code 的编辑,它可以很好地将 2 个 4 位值组合成 1 个字节,那么为什么我的版本没有将 4 个 2 位值组合成 1 个字节?
char byte;
byte = (byte & 0xF0) | (nibble1 & 0xF); // write low quartet
byte = (byte & 0x0F) | ((nibble2 & 0xF) << 4); // write high quartet
我尝试将 0x03 / 0x0C / 0x30 / 0xC0 更改为 0xC0 / 0x30 / 0x0C / 0x03,仍然错误。将 & 0x03 更改为 & 0xC0 也是如此。
【问题讨论】:
-
就个人而言,我不会费心做掩码的事情,只需直接添加值。如果您没有进行大量优化的编译器,则代码更大,但速度更快。第一行:
nibble |= output[i];第二行:nibble <<= 2;但是它不应该解决你的问题。 (哦,很好,因为问题在于您的 = 运算符。)
标签: c++ c bit-manipulation bit bit-shift