算法:两个数不使用算术运算符相加(以及二进制相加)

两个十进制数不使用算术运算符相加。方法为用二进制相加。

只需要 a ^ b 接着 (a & b) << 1 循环往复
(^ 异或不同为真)(& 与 相同为真)
a ^ b 异或用来计算非进位部分
a & b 用来计算进位部分,由于目标已经进位,就需要在原基础上左移一位 << 1

例如:1100 + 0110
1100 ^ 0110 先计算非进位部分使用 ^ 不同为真,只有同位上为1和0时结果才是1,最终结果为1001。
再计算进位部分使用&同真为真,都为1时进位,结果是0100,此时需要进一位,就要左移一位 << 1

// 两个数不使用算术运算符实现相加
public int add(int a, int b) {
    int sum = 0, carry = 0;
    while(b != 0) {
        sum = a ^ b;			// 异或计算未进位的部分
        carry = (a & b) << 1;	// 进位部分3
        a = sum;				// 保存未进位部分,再次计算
        b = carry;				// 保存进位部分,再次计算
    }
    return a;	// 最后无进位,异或的结果即加法结果
}

两个二进制数相加也用了相同的方法
注意: 32 位整数会溢出

// 二进制相加
public String addBinary(String a, String b) {
     int x = Integer.parseInt(a, 2);
	 int y = Integer.parseInt(b, 2);
	  int sum = 0;
	  int carry = 0;
	  while (y != 0) {
	      sum = x ^ y;
	      carry = (x & y) << 1;
	      x = sum;
	      y = carry;
	  }
	  return Integer.toBinaryString(x);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值