這幾乎肯定是一個非常愚蠢的問題,但由於某種原因,我在互聯網校驗和計算中遇到了麻煩。所有的算法基本上是這個樣子:互聯網校驗和位移
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位保留全零。如果是這樣,那麼現在不會總和>> 16現在等於零?如果是這樣,爲什麼那條線呢?
或者我(有可能)今天剛剛完全失智嗎?
太棒了。感謝大家。 – 2009-10-20 22:20:16