c ++函数合并2个值的字节

c++ function to merge bytes of 2 values

我希望能够合并来自两个无符号长参数的字节,恰好取一半字节,以第二个参数的最低有效字节开始的那一半和第一个参数的其余部分。

例如:

x = 0x89ABCDEF12893456 
y = 0x76543210ABCDEF19
result_merged = 0x89ABCDEFABCDEF19

首先,我需要检查我工作的系统是小端还是大端。我已经写了一个函数来检查它,叫做 is_big_endian().

现在我知道 char char *c = (char*) &y 会给出 y 的“第一个”(MSB) 或“最后一个”(LSB)(取决于是否是大端)字节。

现在,我想使用 AND(&) 按位运算符来合并 x 和 y 字节,问题是我怎样才能只得到一半的字节,从 LSB 开始。

我的意思是我可以使用“for”循环遍历 size_of 然后除以 2,但我不知道我应该怎么做。

而且我还考虑过“屏蔽”字节,因为我已经确定给定的参数是“长”的,这意味着 16 位。所以也许我可以通过以下方式屏蔽它们?

我希望能够在 32 位和 64 位系统上使用它,这意味着我的代码是错误的,因为我在这里使用的是固定大小的 64 位长,虽然我不知道系统是什么代码运行。 我考虑过使用数组来存储所有位或者可能使用移位?

unsigned long merge_bytes(unsigned long x, unsigned long int y)
    {
    
     if (is_big_endian() ==0) {
    //little endian system
     return (y & 0xFFFFFFFF00000000) | (x & 0xFFFFFFFFFFFF);
           }
    else
        {
         return (y & 0x00000000FFFFFFFF) | (x & 0xFFFFFFFFFFFF); 
       }
    }

如果那是一个小端系统,我已经“屏蔽”了位的右侧,因为那里的 LSB 离左边位最远。 如果这是一个大端系统,则相反。

如有任何帮助,我们将不胜感激。

您的代码几乎是正确的。你想要这个:

merged = (y & 0x00000000ffffffff) | (x & 0xffffffff00000000);

不需要区分大端和小端。一个值的高位就是这个值的高位。

区别仅在于内存中的表示。

示例:将值 0x12345678 存储在内存位置 0x0000

小端:

Address  byte
-------------
0000     78
0001     56
0002     34
0003     12

大端:

Address  byte
-------------
0000     12
0001     34
0002     56
0003     78