只用位运算实现整数的加减乘除运算

xiaoxiao2021-02-28  48

public class AddMinusMultiDivideByBit { /** * * 加法运算 * @param a * @param b * @return * */ public static int add(int a, int b) { int result = 0; while(b != 0){ result = a ^ b; // 无进位的相加之和, 其结果还差进位后的值 b = (a&b)<<1;//a&b的结果是需要进位的位, 于是将其左移, 与无进位的和再次相加 a = result; } return result; } // 两个数的减法运算, 例如a-b, 可以看成两个数的加法运算, 例如上例可改成a+(-b) // 问题转换成了如何求一个数的相反数,方法为:将其取反然后加一. /** * 减法运算 * @param a * @param b * @return */ public static int minus(int a, int b){ return add(a, negNum(b)); } /** * 取一个数的相反数 * @param b * @return */ private static int negNum(int b) { return (~b + 1); } /** * 乘法运算 * 算法思想 * * a = 3 = 0011 * b = 5 = 0101 * 0011 * * 0101 * ------------ * 0011 * 0000 * 0011 * 0000 * -------------- * 0001111 * * 其实二进制的乘法运算与十进制的乘法算法一样 * 乘法过程:如果乘数b的第i(i >= 0,i = 0是乘数最右侧的那一位)位为1, * 那么该位与被乘数a相乘的结果S[i]就是(a << i); * 然后将这些所有的结果S[i]相加即为最后结果 * @param a * @param b * @return * */ public static int multi(int a, int b){ int result = 0; while(b != 0){ if((b&1) != 0){ // 看最右侧是否为1 result = add(result, a); } a = a<<1; b = b>>1; } return result; } public static void main(String[] args) { int a = 3; int b = 5; System.out.println(add(a, b)); System.out.println(minus(a, b)); System.out.println(multi(a ,b)); } }
转载请注明原文地址: https://www.6miu.com/read-76029.html

最新回复(0)