zoukankan      html  css  js  c++  java
  • 一个简单的二进制加法器

    先用C++随便声明一个bit结构体:

    struct bit
    {
        unsigned char bit_value;
        bit(unsigned int value){
            if (value == 0 || value == 1)
                bit_value = (unsigned char)value;
            else
                bit_value = 0;
        }
        bit()
        {
            bit_value = 0;
        }
    };

    一位与一位的加法称为半加器,因为不考虑后面的进位加进来:

    //sumbit表示加法位,carrybit表示进位
    void halfAdder(bit  operand1, bit operand2, bit &sumbit, bit &carrybit)
    {
        sumbit.bit_value = operand1.bit_value^operand2.bit_value;//异或运算得到加法位,异或运算是两个对象分别或运算和与非运算后,再将两个结果与运算一下。
        carrybit.bit_value = operand1.bit_value&operand2.bit_value; //与运算得到进位。
    }

    可以得到两位:一个加法位(原位)和进位。

    如果考虑进位也要加进来,称为全加器,实际上是三个单bit加运算:

    void fullAdder(bit  operand1, bit operand2, bit inputcarrybit, bit &sumbit, bit &carrybit)
    {
        bit temp_sumbit, temp_carrybit;
        halfAdder(operand1, operand2, temp_sumbit, temp_carrybit);//半加器先计算输入的两位数
        bit temp_carrybit2;
        halfAdder(temp_sumbit, inputcarrybit, sumbit, temp_carrybit2);//半加器再次计算上一步计算所得的加法位和输入的进位
        carrybit.bit_value = temp_carrybit.bit_value | temp_carrybit2.bit_value;//或运算获得最后的进位,其实应该用异或,但不可能出现两种进位都为1的情况
    }

    全加器是两个半加器和一个或门的结合。

    将两个二进制数每个位都用全加器计算一下,并联结起来,便得到最终结果。测试一下:

    bit array1[4] = {bit(1),bit(0),bit(0),bit(1)};
    bit array2[4] = {bit(0),bit(1),bit(1),bit(1)};
    bit array_answer[5];
    
    bit last_carry;
    for (int i = 3; i >= 0; i--)
    {
        bit carry;
        fullAdder(array1[i], array2[i], last_carry, array_answer[i+1], carry);
        last_carry = carry;
        if (i == 0)//最后一轮
            array_answer[0] = carry;
    }
    
    for (int i = 0; i < 5; i++)
        std::cout <<(unsigned int) array_answer[i].bit_value;
  • 相关阅读:
    React生命周期及事件详解
    系统重装后常见的环境变量配置
    Java 字符串格式化
    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
    java-json与js-json转化
    RN项目中缩进处理
    React Native 常用学习链接地址
    React-Native 常用组件学习资料链接
    Swift-继承、构造器、类型转换(嵌套)、类扩展、泛型、协议
    CallKit详解(来电提醒+骚扰拦截)
  • 原文地址:https://www.cnblogs.com/WonderHow/p/6537691.html
Copyright © 2011-2022 走看看