1. 程式人生 > 實用技巧 >Mysql:儲存過程

Mysql:儲存過程

思路

方法:使用位運算實現二進位制加法

Java實現

 1 class Solution {
 2     public int add(int a, int b) {
 3         int sum, carry;
 4         while(b != 0)       //運算到沒進位為止
 5         {
 6             sum = a ^ b;    // 用異或運算求無進位和
 7             carry = (a & b) << 1; 
 8             a = sum;        
 9             b = carry;
10 } 11 return a; 12 } 13 }

C++實現

注意:C++不支援負值左移!!

有2種解決方法:

(1) a&b的結果強轉成unsigned int之後再左移。

 1 class Solution {
 2 public:
 3     int add(int a, int b) 
 4     {
 5         int sum, carry;
 6         while(b != 0)       //運算到沒進位為止
 7         {
 8             sum = a ^ b;    // 用異或運算求無進位和
9 carry = (unsigned int)(a & b) << 1; // C++不支援負值左移!!這裡要加上unsigned int 10 a = sum; 11 b = carry; 12 } 13 return a; 14 } 15 };

(2)用與 x 相與的方法人工去除最高位可能出現的 1, 之後再左移一位。

 1 class Solution {
 2     public int add(int a, int b) {
 3
int x = ~(1 << 31); 4 int sum, carry; 5 while(b != 0) //運算到沒進位為止 6 { 7 sum = a ^ b; // 用異或運算求無進位和 8 carry = (a & b & x) << 1; 9 a = sum; 10 b = carry; 11 } 12 return a; 13 } 14 }

參考

【二進位制求和】超詳細推導公式,打敗100.00%使用者

面試題65. 不用加減乘除做加法(位運算,清晰圖解)

C++實現位運算求和 邏輯清晰的講解

記錄解答時遇見的問題,對負數的左移行為