模二运算

2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC算法之前,必须掌握模2运算的规则。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。


模2加法运算定义为:
0
+0=0      0+1=1      1+0=1      1+1=0
例如0101+0011=0110,列竖式计算:
   0 1 01
+ 0 0 1 1
──────
   0 1 1 0


模2减法运算定义为:
0
-0=0      0-1=1      1-0=1      1-1=0
例如0110-0011=0101,列竖式计算:
   01 1 0
  0 0 1 1
──────

   0 1 0 1


模2乘法运算定义为:
0×0
=0      0×1=0      1×0=0      1×1=1
多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算:
      1 0 1 1
     × 1 0 1
    ──────
            
1 0 1 1
     00 0 0
+ 1 0 1 1
────────

   1 0 0 1 1 1


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



转自  http://blog.sina.com.cn/s/blog_8e669acd0100um7x.html

### 运算的计算方法 运算是一种基于进制数的特殊运算方式,在计算机科学和通信领域中广泛应用。以下是关于运算的具体计算方法及其特点: #### 1. **加法** 加法是指在进制数之间进行无进位的加法操作,其本质是对每一位上的值进行 XOR(异或)运算[^2]。具体规则如下: - `0 ⊕ 0 = 0` - `0 ⊕ 1 = 1` - `1 ⊕ 0 = 1` - `1 ⊕ 1 = 0` 例如,对于两个进制数 `A=1101` 和 `B=1011`,它们的加法结果为: ```plaintext A: 1101 ⊕ B: 1011 --------- Result: 0110 ``` #### 2. **减法** 减法本质上与加法相同,因为在进制中,“减去某一位”等价于对该位取反再做加法。换句话说,减法也可以通过 XOR 运算完成。 #### 3. **除法** 除法主要用于多项式的除法运算,尤其是在 CRC(循环冗余校验)算法中。它的核心思想是不断尝试用被除数去除当前的部分商,直到剩余部分小于除数为止。此过程类似于普通的长除法,但每一步都使用加法代替常规加法。 假设我们需要用 `M=1101` 对 `D=1011` 进行除法,则步骤如下: 1. 将 M 左移至首位对齐 D; 2. 使用加法消掉最高有效位; 3. 继续移动并重复上述过程直至结束。 最终得到的结果包括商 Q 和余 R。 #### 示例代码实现 下面是一个 Python 实现除法的例子: ```python def mod_two_division(dividend, divisor): pick = len(divisor) tmp = dividend[:pick] while pick < len(dividend): if tmp[0] == '1': tmp = xor_bits(divisor, tmp) + dividend[pick] else: tmp = xor_bits(['0' * len(divisor)], tmp) + dividend[pick] pick += 1 if tmp[0] == '1': tmp = xor_bits(divisor, tmp) else: tmp = xor_bits('0'*len(divisor), tmp) return tmp def xor_bits(a, b): res = [] for i in range(1, len(b)): if a[i] == b[i]: res.append('0') else: res.append('1') return ''.join(res) # Example Usage dividend = "11101" divisor = "101" remainder = mod_two_division(dividend, divisor) print(f"Remainder after Modulo-2 Division is {remainder}") ``` #### 结论 综上所述,运算是指按照进制体系下的特定规则来进行的一系列数学操作,主要特点是忽略传统意义上的进位机制,并且广泛应用于数据传输验证等领域之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值