连接不同长度的二进制数

Che*_*zey 5 c++ bit-manipulation

所以我有3个号码.一个是a char,另外两个是int16_t(也称为shorts,但根据表格,我发现短路不会可靠地为16位).

我想将它们连接在一起.所以说它们的价值是:

10010001

1111111111111101

1001011010110101

我想最终得到一个long long包含:

1001000111111111111111011001011010110101000000000000000000000000

使用我在网上找到的一些解决方案,我想出了这个:

long long result;
result = num1;
result = (result << 8) | num2;
result = (result << 24) | num3;
Run Code Online (Sandbox Code Playgroud)

但它不起作用; 当它被解码时,它给了我很奇怪的数字.

如果我的解码代码有问题,这里是:

char num1 = num & 0xff;
int16_t num2 = num << 8 & 0xffff;
int16_t num3 = num << 24 & 0xffff;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我怀疑它与a的大小有关long long,但我不能完全绕过它,我想在后面有更多数字的空间.

MGr*_*ant 9

要根据您的要求获得正确的位模式,您应该使用:

result = num1;
result = (result << 16) | num2;
result = (result << 16) | num3; 
result<<=24;
Run Code Online (Sandbox Code Playgroud)

这将产生您请求的精确位模式,lsb-end左侧的24位0:

1001000111111111111111011001011010110101000000000000000000000000
Run Code Online (Sandbox Code Playgroud)