【问题标题】:c function to merge bytesc函数合并字节
【发布时间】:2015-10-23 19:24:13
【问题描述】:

我必须在 c 中编写函数来合并来自两个无符号 int 参数的字节, 取第二个参数的最高有效字节和第一个参数的其余部分。

例如,如果给定x = 0x89ABCDEFy = 0x76543210,那么函数应该返回0x76ABCDEF

现在我知道 char *c = (char*) &y 会给我 y 的 MSB,但是我不知道如何在没有他的 MSB 的情况下将它链接到 x 的其余部分。

说实话,我完全忘记了用 C 做这么简单的事情,因为去年我所有的课程都使用了 Java,而且我在网上找不到它,所以任何帮助都将不胜感激。

【问题讨论】:

  • (y & 0xff000000) | (x & 0x00ffffff) ...但它是如何工作的? - 编辑
  • 您是否假设unsigned 正好是 32 位宽?如果代码是 64 位,代码应该怎么做?如果您的意思是 32 位,您可能想要使用 uint32_t

标签: c byte


【解决方案1】:

这看起来像是位掩码的工作:

unsigned merge(unsigned x, unsigned y)
{
    return (y & 0xFF000000) | (x & 0xFFFFFF);
}

假设是 32 位值,这使用按位与从 y 中删除除顶部字节之外的所有字节,并且仅从 x 中删除顶部字节,然后使用按位 OR 将它们合并在一起。

【讨论】:

  • @GradyPlayer 你叫什么y >> 24
  • @GradyPlayer 啊!固定。
  • C11 是否仍然允许省略 int
  • @user4464936 是的,它不假设字节顺序。
【解决方案2】:

如果您想支持已知长度的整数字段,使用按位运算符是正确的选择,就像其他人建议的那样。但我会以这种方式使用 char 指针回答您的具体问题:

unsigned int result;

char * rPtr = (char*) &result;
char * xPtr = (char*) &x;

*xPtr++;
*rPtr++ = *((char*)&y);
for(i = 1; i < sizeof(result); i++) {
    *rPtr++ = *xPtr++;
}

【讨论】:

  • OP 暗示他/她的机器是大端的。 now I know that char *c = (char*) &amp;y will give me the MSB of y
  • @user3528438 谢谢,其实我没明白MSB是什么意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多