a+b问题

问题是不用加号 写出a+b的结果
假设a是5 b是6
首先考虑用位用算
这里有几个位运算符号 ^ & >>

  1. ^的意思是位异或与 就是把a和b的各个位进行异或运算 同为1或0时为0 否则是1
    比如 5用2进制表示是 0101
    6用2进制表示是 0110
    他俩异或运算 0011
    相当于是没有进位的加
  2. &是且 只有上下都是1时才为1 否则为0
    5和6的且运算结果是0100
    相当于是记录 哪位是该进位的
  3. <<是左移位
    比如 5<<1
    0101 << 1 左移一位变成 01010 相当于5*2

所以a+b的思路就是 (a^b) + (a&b)<<1
然后这个+ 可以继续 分解 直到 (a&b)没有进位
此时 (a^b)的结果即为a+b的值
代码如下:
非递归

		public int aplusb(int a, int b) {     
		       while(b!=0){
		           //没有进位的+的结果
		           int sum = a ^ b;
		           //有进位的值
		           int carry = (a & b)<<1;
		           a = sum;
		           b = carry;
		       }
		       return a;
		}

递归`

	public int aplusb(int a, int b) {
       if(b!=0){
           return aplusb(a^b,(a&b)<<1);
       }else{
           return a;
       }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值