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
我希望能够合并来自两个无符号长参数的字节,恰好取一半字节,以第二个参数的最低有效字节开始的那一半和第一个参数的其余部分。
例如:
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