gpt4 book ai didi

c++ - 校验和和位移位

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:02 24 4
gpt4 key购买 nike

我正在学习创建原始数据包并按照 this 发送它教程。在我到达生成校验和的代码之前,一切都有意义。

unsigned short csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}

看起来他正在总结缓冲区中的所有单词。但是当我点击

  sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);

我完全迷路了。看起来他将所有位都右移了,基本上丢弃了除结转以外的所有位,然后将其加回到原始总和中?为什么 & 0xfff 是必需的?毕竟,为什么要再次添加执行位?是不是因为可能会有二次进位?

最佳答案

行:

sum = (sum >> 16) + (sum & 0xffff);

将 32 位整数中的左右 16 位字相加。它基本上将数字分成两半并将两半加在一起。 sum>>16 给出左半部分,sum & 0xffff 给出右半部分。

然后当这 2 个加在一起时,它们可能会溢出。这一行:

sum += (sum >> 16);

将溢出添加回原始数字。

关于c++ - 校验和和位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671382/

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