如何在C++中将4个字节连接成8个字节?

3

如何将4个字节连接成8个字节?

例子:

long var1 = 0x01011; //0001 0000 0001 0001
long var2 = 0x03034; //0011 0000 0011 0100
// MAGIC...
long result = 0x10113034; //0001 0000 0001 0001 0011 0000 0011 0100

8
你的示例将两个2字节的数字拼接成一个4字节的数字。 - JohnFilleau
6
阅读你最喜欢的C++教材中的位移操作符。翻译后的代码为:result = (var1 << 16) + var2;,意思是将变量var1左移16位后加上var2的值并将结果赋给result变量。 - Igor Tandetnik
5
对于这种位操作,请始终使用“unsigned”类型,但不要改变原来的意思。 - Tom Zych
3个回答

2
使用移位和加法将元素组合起来。在这种情况下,您将两个4字节的int组合成一个8字节的long long。
unsigned int a = 0x01020304;
unsigned int b = 0x0a0b0c0e;
unsigned long long c = (((unsigned long long)a) << 32)  + b;
// c=0x010203040a0b0c0e

0
using ul = unsigned long;

long concat(long var1, long var2) {
    ul result  = (static_cast<ul>(var1)<<16) | static_cast<ul>(var2); 
    return static_cast<long>(result);
}

这个函数返回你想要的结果,我没有进行过广泛的测试,但直觉上它应该像样例一样工作。


由于左移操作不会对符号位进行特殊处理,所以转换为无符号类型是否必要? - Maxim Egorushkin
可能并不是非常必要,因此在OR操作之后可以合并类型转换,但由于我对CPU中的实现方式或标准规定并不完全了解,所以我不想冒任何风险。 - Alperen Keleş

0

最简单的方法可能是:

通过使用二进制运算符:

unsigned long var1 = 0x1011; //0001 0000 0001 0001
unsigned long var2 = 0x3034; //0011 0000 0011 0100
unsigned long result = (var1 << 16) | var2; //Magic!: 0001 0000 0001 0001 0011 0000 0011 0100

顺便说一下,我相信这是编码/计算的最快方式!

提示:在二进制操作中使用无符号数,否则可能会得到意想不到的结果!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接