我在 K&R II C Programming ANSI C 书中读到“>>”和“<<”运算符控制位,当然,作为菜鸟,我不明白何时使用它们。我对弄清楚如何手动构建数据包很感兴趣,我遇到了以下代码段:
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 (unsigned short)(~sum);
}
我知道这会计算校验和,但我不明白这里发生了什么。XD
显然这超出了我的技能范围,但我想我可以使用这个片段作为替罪羊来找出一些悬而未决的问题。您何时知道何时使用按位运算符来实现某个值,为什么不直接加 (+) 或减 (-)?另外,如果两者没有运算符,为什么&0xffff
旁边有一个十六进制?sum
PS是什么~sum
意思?