今天乙個小朋友問了我乙個很有意思的問題:」不用加號的加法運算「,大抵就是說,」誒~網上有人不用【+】就可以實現加法喲~「
這個問題以前大學的時候玩過,是乙個很有意思的問題。
每個人小學的時候,都學過四則運算,但是因為四則運算太簡單了,我們誰也沒有注意過我們學習的四則運算包括術式的寫法有乙個前提,就是:在十進位制中!
而根據馮諾依曼原理的第一條:數字計算機的數制採用二進位制。在二進位制條件下,計算往往是採用邏輯計算的方法實現的,而非四則方法。這就為這個命題提供了可能性。
我們可以模擬四則中的加法運算進行分析,加法最煩的就是進製。而二進位制計算特別容易進製。什麼時候會進製呢。相同位的加數被加數出現了同樣為1的情況(邏輯與)。為了完成進製,還要右移一位。
最討厭的進製問題解決完了(記得小學時候沒少因為這個被罵),那麼不進製的怎麼辦?下面用例項說明: 12 + 9 = 21在同位的前提下,0和1碰見,是1(反之也是),0和0碰見是0,1和1碰見的話會進製,所以當前位還是0。
通過上邊分析發現,在刨去進製的問題後,剩下的計算,就是乙個異或的邏輯運算。
12的二進位制數是 1100
9的二進位制數是 1001
我們首先計算不進製的,異或計算, 0101下面通過程式來實現這個計算:進製的計算(邏輯與) 1000 左移有一位後 10000
繼續計算, 0101 與10000的異或計算 10101
邏輯與運算結果是00000,由於進製已經結束。則計算結束。二進位制10101就是最終的計算結果,即十進位制的21.
#include #include int opercnt; /* number of operations */
int num1 = 0; /* addend 1 */
int num2 = 0; /* addend 2 */
int rst = 0; /* sum */
int add(int n1, int n2); /* addition function */
/* main function */
int main(int argc, char* ar**)else
}printf("= formula ******************************=\n");
printf("%d + %d \n", num1, num2);
printf("****************************************=\n");
rst = add(num1, num2);
printf("= result ******************************==\n");
printf("%d + %d = %d\n", num1, num2, rst);
printf("****************************************=\n");
exit(0);
}/* addition function */
int add(int n1, int n2)
int cxor = n1 ^ n2;
int candl = (n1 & n2) << 1;
return add(cxor, candl);
}
程式執行
[densintian@rachel src]$ gcc add.cpp
[densintian@rachel src]$ ./a.out 12 9
= formula ******************************=
12 + 9
****************************************=
operation times:1
addend 1=12, addend 2=9
operation times:2
addend 1=5, addend 2=16
operation times:3
addend 1=21, addend 2=0
= result ******************************==
12 + 9 = 21
****************************************=
LeetCode 不用加號的加法(位運算)
解題思路 位運算,只能用位運算子。a b同號比較好處理。主要是異號的情況,考慮 a 0,b 0,因為 a,b的絕對值都不會超過2 32,因此取模數為2 32。根據同餘方程可知 a b mod a mod b mod,mod b即為負數b在mod下的補碼 b int 1 32,2 如果 a mod b...
leetcode 不用加號的加法
一開始做看不懂,後來琢磨了一下,在 附近寫了注釋,這其實就是很簡單的位運算,只是需要熟練 def add a,b a 0xffffffff b 0xffffffff while b 0 終止條件 沒有進製了 carry a b 把需要進製的位顯示出來,用1表示該位需要進製 a b 第一次迴圈為求出不...
不用四則運算完成加法運算
題目 寫乙個函式,求兩個數之和,不能使用四則運算。分析 四則運算都不能用,那還能用什麼啊?可是問題總是要解決的,只能開啟思路去思考各種可能性。首先我們可以分析人們是如何做十進位制的加法的,比如是如何得出5 17 22這個結果的。實際上,我們可以分成三步的 第一步只做各位相加不進製,此時相加的結果是1...