資料結構 只用位運算實現加減乘除操作

2022-08-10 07:57:09 字數 1937 閱讀 3579

實現加法

public class arithmetic 

/*** 兩數之差

* a - b實際上就是a + (-b)

* 在實際中做減法時,-b是用補碼 取反 + 1

* @param a

* @param b

* @return

*/public static int substract(int a, int b)

/*** 求乙個數的相反數 取反再+1

* @param a

* @return

*/public static int negative(int a)

/*** 求乙個數的符號,

* 0則為正數,否則就返回-1

* @param a

* @return

*/public static int sign(int a)

/*** 將數變為正數,如果數為正數,則為其本身,如果為負數,則變為其相反數

* @param a

* @return

*/public static int positive(int a)

/*** 兩數乘積

* 先計算兩個正數的乘積,然後符號最後加上

* 兩個正數的乘積,a, b 就是 a 進行 b 次加法

* 注意最後加上符號

* @param a

* @param b

* @return

*/public static int multiply(int a, int b)

if(flag)

return res;

}/**

* 兩數之積

* 0101

* 0110

** 0000

* 0101

* 0101

* 0000

* 對應位置求和即可

** 根據 b 每一位為 1 就將 a 左移一位加到 res 上即可,為 0 就什麼都不做

* @param a

* @param b

* @return

*/public static int multiplay1(int a, int b)

a = a << 1;

b = b >> 1;

}if(flag) return negative( res );

return res;

}/**

* 兩數的商

* 用a - b,一直減,知道a < b時,此時減的次數就是商,a 就是餘數

* 注意還有符號

* @param a

* @param b

* @return

*/public static int divide(int a, int b)

if(flag)

return res;

}/**

* 兩數之商

* 上面那種方法,每次都是減去乙個 b,如果 b 太小的話,會計算的很慢

* 而如果以 b 的 2^i 倍開始減的話,如果 a 夠減,則結果上加上 2 ^ i 倍

* 首先要判斷 a 是否大於 b 的 2 ^ i倍

* 改為判斷 a / (2 ^ i) 與 b 的大小,這樣可以防止溢位

* a * (1 >> i) = a >> i

* (a >> i) >= b

* @param a

* @param b

* @return

*/public static int divide1(int a, int b)

i = substract( i, 1 );

}if(flag) return negative( res );

return res;

}public static void main(string args)

}

位運算實現加減乘除

include include 加法運算 int add int a,int b 補碼中正數轉負數的原理 int negative int a 減法運算 int sub int a,int b 判斷正負 bool isnegative int a 僅計算正數乘法 int multi help int...

位運算實現加減乘除

關於邏輯右移和算術右移 vs中,對於unsigned型別,是邏輯右移,對於signed,算術右移 加法器的實現 對於不考慮進製的加法 0 0 0 1 0 1 0 1 1 1 1 0 即是異或運算 考慮進製 0 0 1 0 0 0 1 0 1 1 1 即是與運算 以下程式,a即不考慮進製部分,b為進製...

位運算實現加減乘除

位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。...