先用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;