【发布时间】:2009-10-20 22:03:53
【问题描述】:
这几乎可以肯定是一个非常愚蠢的问题,但由于某种原因,我在互联网校验和计算方面遇到了麻烦。所有的算法基本上都是这样的:
WORD chksm(WORD *startpos, WORD checklen){
ulong sum = 0;
WORD answer = 0;
while (checklen > 1)
{
sum += *startpos++;
checklen -= 2;
}
if (checklen == 1)
{
*(BYTE *)(&answer) = *(BYTE *)startpos;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;}
我什么都清楚,除了这条线:
sum += (sum >> 16);
它看起来就像在将前 16 位添加到后 16 位之前的行,在前 16 位中留下全零。如果是这种情况,那么 sum >> 16 现在不会等于零吗?如果是这样,那为什么会有那条线?
或者我(很可能)今天只是完全精神失常?
【问题讨论】:
标签: c bit-manipulation checksum