二进制反码求和是怎样求的?

作者&投稿:策梦 (若有异议请与网页底部的电邮联系)
二进制反码运算是怎么计算的~

两个数进行二进制反码求和的运算,它的规则是从低位到高位逐列进行计算。0和0相加是0但要产生一个进位1,0和1相加是1,1和1相加是0。若最高位相加后产生进位,则最后得到的结果要加1。
举例:已知X = + 1101 , Y = + 0110 , 用反码计算Z = X-Y。
[X]反 = 01101
[-Y]反 = 11001
则[Z]反 =[X]反+[-Y]反 = 01101+11001+1(循环进位)= 00111
其真值为Z = +0111

扩展资料:
运算注意事项
1、反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。
2、反码运算时,其符号位与数值一起参加运算。
3、用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。
参考资料来源:百度百科-反码算数运算

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下:在发送数据时,为了计算IP数据包的校验和。应该按如下步骤:(1)把IP数据包的校验和字段置为0;(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;(3)把得到的结果存入校验和字段中。在接收数据时,计算数据包的校验和相对简单,按如下步骤:(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;(2)检查计算出的校验和的结果是否等于零(反码应为16个0);(3)如果等于零,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。所谓的二进制反码求和,即为先进行二进制数取反,然后求和,如果最高位进一,则保存到最低位即可。计算对IP首部检验和的算法如下:(1)把IP数据包的校验和字段置为0;(2)把首部看成以16位为单位的数字组成,依次进行二进制求和(注意:求和时应将最高位的进位保存,所以加法应采用32位加法);(3)将上述加法过程中产生的进位(最高位的进位)加到低16位(采用32位加法时,即为将高16位与低16位相加,之后还要把该次加法最高位产生的进位加到低16位)(4)将上述的和取反,即得到校验和。

算法实现:

  unsigned short ip_fast_csum(unsigned char * iph,

      unsigned int ihl)

    {

    unsigned int sum;

       __asm__ __volatile__(

        "movl (%1), %0 ;
"

        "subl , %2 ;
"

        "jbe 2f ;
"

        "addl 4(%1), %0 ;
"

        "adcl 8(%1), %0 ;
"

        "adcl 12(%1), %0 ;
"

    "1:     adcl 16(%1), %0 ;
"

        "lea 4(%1), %1 ;
"

        "decl %2 ;
"

        "jne 1b ;
"

        "adcl , %0 ;
"

        "movl %0, %2 ;
"

        "shrl , %0 ;
"

        "addw %w2, %w0 ;
"

        "adcl , %0 ;
"

        "notl %0 ;
"

    "2: ;
"

       : "=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



规则是从低到高位逐列进行计算,0和0加得0,0和1加得1,1和1加得0但要产生一个进位1,加到下一列,若最高位产生了进位,则最后得到的结果要加1。

例如:

0 1 0 1 0

+1 1 0 1 1

————

= 0 0 1 0 1(高位产生进位,所以需要再加1)

+0 0 0 0 1

——————

=0 0 1 1 0

扩展资料:

注意事项

对一个无符号的数,先求其反码,然后从低位到高位,按位相加,有益处则向高位进1(和一般的二进制法则一样),若最高位有进位,则向最低位进1。

首先这里的反反码好像和以前学的有符号反码不一样,这里不分正负数,直接每个为都取反。

这种操作,使得在发送加法进位溢出时,溢出值并不是10000,而是1111.也即是当相加结果满1111时溢出,这样也可以说明为什么0000和1111都表示0了。

两种二进制反码求和的运算:

原码加法运算:

3(0011)+5(0101)=8(1000)

8(1000)+9(1001)=1(0001)

反码加法运算:

3(1100)+5(1010)=8(0111)

8(0111)+9(0110)=2(1101)

从上面的例子中,当加法未发生溢出时,原码与反码加法运算结果一样;当有溢出时,结果就不一样了,原码是满10000溢出,而反码是满1111溢出,所以相差正好是1。

另外,关于二进制反码求和运算需要说明的一点是,先取反后相加与先相加后取反,得到的结果是一样的。



其实二进制反码求和规则很简单,你一看便懂:
规则是从低到高位逐列进行计算。0和0加得0,0和1加得1,1和1加得0但要产生一个进位1,加到下一列。若最高位产生了进位,则最后得到的结果要加1。
0 1 0 1 0
+1 1 0 1 1
————
= 0 0 1 0 1(高位产生进位,所以需要再加1)
+0 0 0 0 1
——————
=0 0 1 1 0

看在我这么认真的份上就给我吧。。呵呵。。还是希望对你有帮助哦

相当于模二求和。
如1+1=0 0+0=0 0+1=1

你看看下边这个网址吧,就是关于这个的,
http://baike.baidu.com/view/1355635.htm
我就是看了这个后懂的,希望对你有所帮助。


传输层分组的检错方式是
校验和的计算方法有多种,最常见的是反码求和法。这种方法的基本步骤是,将数据分组中的每个字节视为一个8位的二进制数,对这些二进制数进行反码求和(即遇到1加0,遇到0加1),并将结果取反,得到校验和。发送方将计算得到的校验和附加在数据分组的尾部,一同发送给接收方。在实际应用中,传输层协议...

23.3二进制的原码反码补码?
十进制整数转二进制,除2取余逆序排列;十进制小数转二进制,乘2取整顺序排列。二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,逢2进1。按权展开求和,该方法的具体步骤是先将二进制的数写成加权系数展开式,而后根据十进制的加法规则进行求和。

二进制数原码、反码、补码各表示什么数
N位二进制数原码,反码,所能表示的十进制数的范围都是是-2^(N-1)-1~+2^(N-1)-1。N位二进制数补码能表示的十进制数的范围是-2^(N-1)~+2^(N-1)-1。二进制数转换成十进制数使用"按权相加"法,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。原码表示法规定:用符号位...

反码原码补码什么意思
4、补码 补码是在反码的基础上,将其最低位加1。正数的补码与原码相同。例如,整数+5的补码仍为00000101,整数-5的补码为11111011。5、表示和运算 使用补码来表示负数有助于简化计算机中的加法和减法运算。由于补码的性质,加法和减法的运算可以统一进行,减法可以简化为补码求和的操作。此外,补码还能够...

高数问题。
-0按照负数的规则,那么原码00000000的反码还是00000000,原码10000000的反码是11111111。对于8位二进制数来说,反码的取值范围是11111111到011111111,其对应的真值的取值范围是-127到127,其中0对应+0和-0两个反码。而且这里需要说到一个模型:正负真值的反码求和为11111111,但是原码没有这个规律。

c语言里面,反码谁发明的
当然是c语言的专家了。所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。原码10010= 反码11101 (10010,1为符号码,故为负)(11101) 二进制= -2 十进制...

首部检验和怎么计算
首部检验的方法是,吧首部分成一些16字的序列,将首部检验置0,然后对这些序列进行反码算数运算。求出来的这个和的反码放入首部检验位(16位)。收到数据报时进行检验:就是把首部再反码求和一遍,然后再取反码,这时应该得到0。所以说前五行就是首部的前五行。然后接下来的五行就是,换算成2进制的序列...

假设数据为字符串C=0123456,以8位为单位分段,求出校验和,如果字符0...
字符串校验和的一种实现方法是:(1)把校验和字段设置为0。 (2)把需要校验的数据看成以8位为单位的数字组成,依次进行求和,得到的和二进制求反码,再加上1,最终得到校验和。 (3)把得到的结果存入校验和字段中。对于您给出的数据C=0123456,以8位为单位分段,我们可以将其转换为ASCII码表示:C=...

二进制算法?
二进制的或运算:遇1得1 二进制的与运算:遇0得0 二进制的非运算:各位取反 加法法则: 0+0=0,0+1=1,1+0=1,1+1=10 减法,当需要向上一位借数时,必须把上一位的1看成下一位的(2)10。减法法则: 0-0 =0,1-0=1,1-1=0,0-1=1 有借位,借1当(10) 看成 2 则 0 ...

计算机内数的表示与编码
二、非十进制数转换成十进制数转换方法 非十进制数转换成十制数采用“位权法”,即把各非十进制数按位权展开,然后求和。 三、二、八、十进制数之间转换1、二进制 数与八进制数之间的转换转换方法 a、把二进制数转换为八进制数时,按“三位并一位”的方法进行。以小数点为界,将整数部分从右向左每三位一组...

狮子山区15759766642: 二进制反码求和 - 搜狗百科
熊锦苁蓉: 其实二进制反码求和规则很简单,你一看便懂:规则是从低到高位逐列进行计算.0和0加得0,0和1加得1,1和1加得0但要产生一个进位1,加到下一列.若最高位产生了进位,则最后得到的结果要加1.0 1 0 1 0 +1 1 0 1 1 ———— = 0 0 1 0 1(高位产生进位,所以需要再加1) +0 0 0 0 1 —————— =0 0 1 1 0看在我这么认真的份上就给我吧..呵呵..还是希望对你有帮助哦

狮子山区15759766642: 反码算术运算法则?那么补码的运算法则了?“两个数进行二进制反码求和:0和0相加是0 ,0和1相加是1 ,1和1相加是0但要产生一个进位1,加到下一列.若... -
熊锦苁蓉:[答案] 加法: 二进制加法运算,若最高位产生进位,则结果加1. 减法: 二进制减法运算,若最高位产生借位,则结果减1. 如: (-39)+(+17)=-22 11011000 + 00010001 --------------- 11101001 = 11101001 (-39)+(-56)=-95 11011000 + 11000111 -----------...

狮子山区15759766642: 分别用二进制反码和补码运算求 - 54 - 30 -
熊锦苁蓉: 为了简单 下面用一个字节表示一个整数 -54 原码 10110110 反码 11001001 补码 11001010 -30 原码 10011110 反码 11100001 补码 11100010 反码相加 11001001+11100001 -> 10101010+1=10101011 -> (取反) 11010100(-84) 补码相加 ...

狮子山区15759766642: 反码算术运算求和 -
熊锦苁蓉: 不是,是把里面的数据按照16位依次取出,然后按照反码算数运算求和,也就跟正常加法一样,只不过如果最高位有进位则最终结果要加一,然后再求其反码即可

狮子山区15759766642: 两个负数的反码和补码怎么算两个负数的补码相加得正?题目是要求用反码和补码计算 - 126 - 100,烦 -
熊锦苁蓉:[答案] 一:对于正数,原码和反码,补码都是一样的,都是正数本身. 对于负数,原码是符号位为1,数值部分取X绝对值的二进制. 反码是符号位为1,其它位是原码取反. 补码是符号位为1,其它位是原码取反,未位加1. 也就是说,负数的补码是其反码未位...

狮子山区15759766642: 二进制反码运算求和
熊锦苁蓉: 这是历史话题吗? 除符号位(最高位)外取反,求出原码,逐项相加即可!

狮子山区15759766642: 二进制数 原码为101011,它的反码和补码是?怎么求 -
熊锦苁蓉: 原码101011 反码010100 补码010101 反码等于将原码整个反过来 补码等于反码加1

狮子山区15759766642: 二进制求加法,用反码的形式求 - 3+( - 5)=? -
熊锦苁蓉: 在计算机里面,只有无符号数 和 补码,并没有原码、反码. 用反码形式求,不但麻烦,而且也没有任何的意义.

狮子山区15759766642: 二进制数 原码为101011,它的反码和补码是?怎么求啊? 二进制数 补码为101011,它的原码是什么呢?
熊锦苁蓉: 兄弟,你有运气了,今天教你一招,别忘了选我为好最佳答案呀. 记住,以下是原码和补码互换的(负数),正数的补码反码和原码是一样的,这个你应该知道吧 (唯一的,也是独特的)规则如下:从数的右边往左开始数,遇到“0”不理它,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网