NTL密码算法开源库——模2整数

本文详细解析了模2运算,包括模2加法、减法、乘法和除法的原理,以及它们在CRC冗余检验中的应用。通过实例演示和代码实现,展示了模2运算的独特性质和在信息技术中的实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

综述

模2运算是一种二进制算法,不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。

模2运算

 模2加法

两个序列模二相加,即两个序列中对应位相加,不进位,相同为0,不同为1。

1+1=0  0+0=0  1+0=1  0+1=1(相同即为0,否则为1)

例如:

    0 1 0 1

+ 0 0 1 1

──────

   0 1 1 0

模二减法

减法和加法一样,按加法规则运算。

0-0=0  1-1=0  0-1=1 1-0=1(相同即为0,否则为1)

例如:

 0 1 1 0

-0 0 1 1

──────

 0 1 0 1

模二乘法

多位二进制模2乘法类似于普通意义上的多位二进制乘法,或者是十进制乘法。不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。

0×0=0 0×1=0 1×0=0 1×1=1(除11为1外,其余都为0)

例如:

    1 0 1 1

     × 1 0 1

  ——————

     1 0 1 1

  0 0 0 0

 1 0 1 1

——————

1 0 0 1 1 1

模二除法

多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制除法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义 的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。

在下面的示例中,当余数位数与除数位数相同时,才进行异或运算,余数首位是1,商就是1,余数首位是0,商就是0。当已经除了几位后,余数位数小于除数,商0,余数往右补一位,位数仍比除数少,则继续商0,当余数位数和除数位数一样时,商1,进行异或运算,得新的余数,以此至被除数最后一位。

例如:

1111000 除以1101,模2除法的商为1011,余数为111.

#第一步 

1111000 

1101 

0010000 ----余数,商为1,只要第一位非0商就是1 

#第二步,每步移一位,当起始位为0时,除以0;为1时除以除数。 

010000 

0000 

010000  ----余数,商为0,只要第一位是0商就是0 

#第三步 

10000 

1101 

01010  -----余数,商为1,这里的余数你猜出,其实就是对应位异或 

#第四步 

1010 

1101 

0111   ------余数,商为1,如果位数比除数还小,不再继续运算 

#最终余数为111,商为1011 

代码实现(加法)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>



int main()

{

    int k[100];//存放计算后的二进制数

    char s1[100],s2[100];//输入的两个二进制数

    int sum,sum1=0,sum2=0;

    int len1,len2;//两个字符数组的长度

    int i=0;

    gets(s1);

    gets(s2);

    len1 = strlen(s1);

    len2 = strlen(s2);

    while(s1[i]!='\0')//第一个二进制数转化为十进制数

    {

        sum1+= pow(2,len1-1)*(s1[i]-48);

        len1--;

        i++;

    }

    i=0;

    while(s2[i]!='\0')//第二个二进制数转化为十进制数

    {

        sum2+= pow(2,len2-1)*(s2[i]-48);

        len2--;

        i++;

    }

    i=0;

    sum = sum1+sum2;//两数和

    while(sum)//和转化为二进制

    {

        k[i] = sum%2;

        sum/=2;

        i++;

    }

    i=i-1;

    while(i>=0)//输出

    {

        printf("%d",k[i]);

        i--;

    }

    return 0;

}



其余代码见@元解~殇怀

PS:模二除法的应用:CRC冗余检验(用于计算机网络中传输过程,检验传输过程是否出错)

CRC循环冗余检验:余数为0就没出错;不能确定哪几个比特出错了

 

 

 

 

 

 

可以看到:

模2除法的每一位的计算是完全独立的,就是异或,根本没有什么进位借位的事儿

如果余数首位为1,则商为0,且再和除数异或一次,第二次的余数首位一定为0了,但是这一次只右移,并不得到商。所以上面的例子中做了8次异或运算,但是只有6位商,因为其中有两次的余数是1

模2运算中除数和余数用的是异或;二进制和十进制除法中除数和余数用的是减法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值