将2字节数分成两个1字节

时间:2019-02-25 19:47:51

标签: c++ binary bit-manipulation bit-shift

我正在尝试将2字节数字分成两个1字节数字。但是我得到了错误的结果。假设数字为:0x1234H

uint8_t high = 0;
uint8_t low = 0;

high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);

cout << std::bitset<8>(high) << endl;
cout << std::bitset<8>(low) << endl;

cout << "high byte: " << static_cast<int >(high) << endl;
cout << "low byte: " << static_cast<int >(low) << endl;

运行代码时,我希望获得以下输出:

0x1234
00001100
00010010
high byte: 12
low byte: 34

我反而得到

0x1234
00110100
00010010
high byte: 34
low byte: 12

为什么我的尝试失败了?

1 个答案:

答案 0 :(得分:3)

那是因为您在这些行上给变量命名错误...

high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);

>>运算符正在将位从高位位置向下移位到低位位置。如果您必须将这些位向下移以保留它们(在转换中),那是因为它们原来不是低位。所以...

low = static_cast<uint8_t >(val & 0xFF);
high = static_cast<uint8_t >(val >> 8);

BTW-无论如何,当转换为uint8_t时,按位和运算符是多余的-已经足以丢弃除低字节以外的所有字节。仍然正确,只是没有必要。