一、题目
二、思路
(a & b) << 1能够计算a和b的所有进位值;
a ^ b则是计算a和b的各位相加(不管进位值)
因为不能使用加法运算符,所以上面两项的结果也不能用加法,只能循环上面的步骤计算。
回顾常用的位运算:
使用位运算 ( x > > i ) (x >> i)(x>>i) & 1 11 得到 x 的第 i 个二进制位。
n & (n - 1)可以将n的二进制位的最低位1移除。如1000和0111做与运算后得到0000,即将1000的最低位的1移除了。
n & (-n)即n与其相反数做与运算。由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1。
有关n & (-n)的结论:如果n是真整数n & (-n) == n,则n是2的幂。
三、代码
class Solution { public: int add(int temp_sum, int jinwei) { //不能使用+号,所以求出异或部分和进位部分后依然不能使用+号 //所以只能循环到没有进位为止 while(jinwei != 0){ //进位为0则停止循环 //计算进位 int a = (unsigned int)(temp_sum & jinwei) << 1; //各位相加,不算进位 temp_sum = temp_sum ^ jinwei; jinwei = a; } return temp_sum; } };