连接来自位集中不同位置的 3 个字符的位

Concatenate Bits from 3 characters, taken from different locations in the bitset

我正在尝试将 3 个字符 abc 的位连接成一个 16 位的位集。约束如下:

在纸上我得到:1111111111110000 与结果相同。但我不确定我连接这些位的方式。首先向左移动 14 个字符 a 然后向左移动 6 个字符 b 最后,因为字符 c 没有 space然后右移2有更好的方法吗?我已经很困惑了


#include <iostream>
#include <bitset>

int main() {
   int a = 0b11111111 & 0b00000011;
   int b = 0b11111111;
   int c = 0b11111111 & 0b11000000;
   
   uint16_t newVal1 = (a << 14) + (b << 6) + (c >> 2 );
   std::cout << std::bitset<16>(newVal1).to_string() << std::endl;
   
   return 0;
}

首先你需要考虑有符号和无符号整数的问题。使用带符号的整数,您可以获得意想不到的符号扩展,将所有的都添加到顶部。并且可能的溢出将导致未定义的行为。

所以我要做的第一件事就是使用所有无符号整数值。

那么为了简单明了,我的建议是你在 newVal1 上做所有的移位,然后只对它做按位或:

unsigned a = /* value of a */;
unsigned b = /* value of b */;
unsigned c = /* value of c */

unsigned newVal1 = 0;
newVal1 |= a & 0x02;  // Get lowest two bits of a
newVal1 <<= 8;  // Make space for the next eight bits
newVal1 |= b & 0xffu;  // "Concatenate" eight bits from b
newVal1 <<= 2;  // Make space for the next two bits
newVal1 |= (c >> 6) & 0x02;  // Get the two "top" bits from c

现在 newVal1 的最低十二位应遵循为您的作业设置的三个规则。位最高位将全为零。