我在K&R II C编程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
?附言
~sum
是什么意思? 最佳答案
这不是一个问题,这是一大堆。 :)
当您想将数字视为位的集合而不是整数时,可以使用按位运算符。说“我希望此位模式向左移动两位”要比创建数学上等效的操作容易得多。它们在概念上是不同的。如果将数字视为位,则使用位运算符会更有意义。& 0xffff
通过屏蔽所有高位来确保该值为16位。假设系统的unsigned long
至少为16位宽,这是一个非常安全的假设。 &
(按位AND
)通常用于此目的。查看truth table中的逻辑连接,并认为“ false为0,true为1”以了解其工作原理。
十六进制常数之前的&
是C的按位AND运算符,用于执行我在上面描述的屏蔽操作。基本上,对于单位变量a & b
,当且仅当1
和a
均为1时,结果为b
。运算符将此逻辑应用于其输入项中的每对位。~
运算符是C的按位求反,它“翻转”其参数的位。它通常用于创建蒙版。