gpt4 book ai didi

c++ - 这实际上是做什么的? - 疯狂的 C++ 函数

转载 作者:IT老高 更新时间:2023-10-28 21:39:14 26 4
gpt4 key购买 nike

我正在处理一些遗留代码,并且遇到了一个函数,该函数显然用于在任意长的字段(比 ntohl 可以处理的更大)上执行网络字节顺序转换。

我无法很好地理解它是否除了在 msg 缓冲区范围内反转字节顺序之外(或者即使它会可靠地做到这一点)。有人可以帮我分解并分析它,以便我可以用更容易理解的东西替换它(或者至少评论它)!?

void swapit(unsigned char *msg, int length) {
for(;length>0;length--, msg++) {
*msg = ((*msg * 0x0802LU & 0x22110LU) |
(*msg * 0x8020LU & 0x88440LU)) *
0x10101LU >> 16;
}
}

最佳答案

要了解它的工作原理,请考虑将操作应用于位模式 abcdefgh。我将用 . 表示二进制数,表示 0,因此非零位会突出显示。

第一个子表达式是:

  ........ ........ abcdefgh
* ........ ....1... ......1. (0x0802)
= .....abc defgh..a bcdefgh.
& ......1. ..1....1 ...1.... (0x22110)
= ......b. ..f....a ...e....

第二个是:

  ........ ........ abcdefgh
* ........ 1....... ..1..... (0x8020)
= .abcdefg h..abcde fgh.....
& ....1... 1....1.. .1...... (0x88440)
= ....d... h....c.. .g......

将它们组合并乘以最终常数得到:

  ......b. ..f....a ...e....
| ....d... h....c.. .g......
= ....d.b. h.f..c.a .g.e....
* .......1 .......1 .......1 (0x10101)
= ....d.b. h.f..c.a .g.e....
+h.f..c.a .g.e.... ........
+.g.e.... ........ ........
= hgfedcba hgfe.c.a .g.e....

最后向下移动 16 位得到 hgfedcba,与原始模式相反。

关于c++ - 这实际上是做什么的? - 疯狂的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8492028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com