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

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));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值