利用位运算数学式子使两个二进制数进行加减乘除
如我们平时所见,要将两个二进制数相加,很简单,但是如果让你来设计程序来实现计算机的运算,倒是有一番难度。
接下来我们将使用位运算式子,来方便我们编写计算二进制数的程序,毕竟只要使用公式实现了加法的运算,其它复杂的运算都可以由加法来模拟。
以下只是提供一种程序编写的思路,不涉及具体的程序语言及代码细节
现将两个二进制数binary1, binary2相加,则又以下三种情况
1、若binary1与binary2都为正数,则公式为
//其中carryBit为需要进位的二进制数
//注意result、binary1、binary2始终都为二进制形式
binary = binary1 ^ binary2;
result = binary ^ carryBit;
//carryBit 的计算方法为
carryBit = (binary1&binary2)<<1; //其实carryBit这么算还不完整,但为了方便理解,暂且先这样,稍后再讲解
//因此合并起来则为:
result = binary1^binary2 ^ ( (binary1^binary2)<<1 );
去掉啰嗦的注释后:
result = binary1^binary2 ^ ( (binary1^binary2)<<1 );
例1: 2 + 3 = 5
① 二进制形式: 000010 + 000011 = 000101
000010 binary1
^ 000011 binary2
-----------------
000001 binary
②还记得carryBit嘛?第二步我们还需要求的就是它
000010 binary1
& 000011 binary2
-----------------
000010
<< 1
-----------------
000100 carryBit
③之后carryBit 需要与binary1、binary2异或之后的binary进行 异或 运算
000001 binary
^ 000100 carryBit
-----------------
000101 result //漂亮的答案
2、若binary1与binary2都为负数,则式子为
//由于需要将binary1与binary2转化为补码,因此先取反再加1
binary1 = (~binary1)+1; //注意符号位不取反
binary2 = (~binary2)+1; //注意符号位不取反
//转化为补码形式后,计算两个二进制数相加时,与binary1、binary2都为正时的计算一样
binary = binary1 ^ binary2;
result = binary ^ carryBit;
//计算之后,由于result 处于补码形式,因此需要转化为原码,先减1再取反
result = ~(result-1); //注意符号位不取反
去掉啰嗦的注释后:
binary1 = (~binary1)+1;
binary2 = (~binary2)+1;
result = binary1^binary2 ^ carryBit;
result = ~(result-1);
例2: -2 + (-3) = -5
① 二进制形式: 100010 + 100011 = 100101
负数需取补码: 111110+ 111101= 111011
111110 binary1
^ 111101 binary2
-----------------
000011 binary
②求carryBit
111110 binary1
& 111101 binary2
-----------------