1. checksum calculation

hi all,
When I tried to learn about IP checksum I came across the following function for checksum calculation.can any one please explain the code.

Code:
```u_short
in_cksum(register u_short *addr, register int len)
{
register int nleft = len;
register int sum = 0;

/*
*  Our algorithm is simple, using a 32 bit accumulator (sum),
*  we add sequential 16 bit words to it, and at the end, fold
*  back all the carry bits from the top 16 bits into the lower
*  16 bits.
*/
while (nleft > 1)  {
sum += *w++;
nleft -= 2;
}

/* mop up an odd byte, if necessary */
if (nleft == 1)
sum += *(u_char *)w;

/*
* add back carry outs from top 16 bits to low 16 bits
*/
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16);         /* add carry */
answer = ~sum;              /* truncate to 16 bits */
}```
Thanks..

2. >> can any one please explain the code

3. Perhaps there are specific bits you don't understand?

4. Is there some other programming language you are more familiar with that we could translate it to perhaps?