所需工具:笔、纸。
具体计算步骤如下:
1、先把两个数对齐,和十进制计算时候第一步一样。
2、从最右边对齐的上下两个数开始。
3、1+0=1,0+0=0。如果两个数不是都是1,那么直接相加就好,直接写在下面。
4、1+1=10,把1写上面,把0写下面。
5、1 +1 +1 = 11,要注意进位。
6、依次类推,计算完成。
算法实现:
unsigned short ip_fast_csum(unsigned char * iph,
unsigned int ihl)
{
unsigned int sum
__asm__ __volatile__(
"movl (%1), %0 \n"
"subl , %2 \n"
"jbe 2f \n"
"addl 4(%1), %0 \n"
"adcl 8(%1), %0 \n"
"adcl 12(%1), %0 \n"
"1: adcl 16(%1), %0 \n"
"lea 4(%1), %1 \n"
"decl %2 \n"
"jne 1b \n"
"adcl , %0 \n"
"movl %0, %2 \n"
"shrl , %0 \n"
"addw %w2, %w0 \n"
"adcl , %0 \n"
"notl %0 \n"
"2: \n"
: "=r" (sum), "=r" (iph), "=r" (ihl)
: "1" (iph), "2" (ihl)
: "memory")
return(sum)
}
扩展资料
二进制反码求和工作原理 :
0和0相加是0,但要产生一个进位1,0和1相加是1,1和1相加是0.若最高位相加后产生进位,则最后得到的结果要加1。
(0)反 + (0)反 = 1 + 1 = 10
(1)反 +(0)反=0+ 1 =1
(1)反 + (1)反 = 0 + 0 = 0