位的加减乘除问题(cont)

1. 加法:

问题:

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Input:

  • 两个加数 :: int

Output:

  • 加数的和 :: int

Intuition:

不用正常的运算符号,那就得考虑bit运算了。bit运算这种神仙题,反正我是想不出来咋做的。参考其他大神的做法,拢共分三步:
第一步, 用一个变量存进位项, 用与来实现
第二步, 不考虑进位两数相加,用异或实现
第三步, 把进位加上
退出循环的条件就是,没有进位可以加了。

Code:

TC: O(n) SC: O(1)

public int sumOf2(int a, int b){
  while (b != 0){
    int c = a & b; //store carry
    a ^= b; //no carray addition
    b = c << 1;
  }
  return a;
}

2.减法

问题:

Calculate the difference between two integers a and b, but you are not allowed to use the operator + and -.

Input:

减数和被减数 :: int

Output:

差 :: int

Intuition:

既然加法都已经搞定了,那减法转个弯就可以想到:加一个负数嘛。那么一个数的相反数怎么用位运算得到呢?取反加一(敲黑板),这个记住了以后遇到用就行了。

Code:

TC: O(n) SC: O(1)

public int difOf2(int a , int b){
  return sumOf2(a, sumOf2(~b, 1));
}

3.乘法

问题:

Calculate the product of two integers a and b, but you are not allowed to use the operator *, + and -.

Input:

两个乘数 :: int

Output:

积 :: int

Intuition:

Reference:

https://leetcode.com/problems/sum-of-two-integers/description/

你可能感兴趣的:(位的加减乘除问题(cont))