7.15 位运算 02

85 阅读1分钟

1 . 数值的整数次方

[](剑指 Offer 16. 数值的整数次方 - 力扣(LeetCode))

0473.png

var myPow = function(x, n) {
    if(n===0) return 1;
    if(n===1) return x;
   var abs = Math.abs(n);
   var result = 1;
   while(abs)
   {
       if(abs&1)        // 判断奇偶数
       {
          result = result * x;
       }
       x = x * x ;
       abs = abs >>> 1 ;   // 右移相当于除以2
   }
   if(n>0) return result;
   else return (1.0/result);
};

2 . 不用加减乘除做加法

[](剑指 Offer 65. 不用加减乘除做加法 - 力扣(LeetCode))

0474.png

我们学加法的时候,老师教我们先算本位的和,进1在计算步骤标记一个1来进位。计算机做运算是一样的,为了降低思考复杂度,我们把标注的进位值记录成一个新的数值。则计算结果变为未进位值与进位值计算。

  • 我们发现按位加法(不进位)分四种情况 1 + 1 = 0, 0 + 0 = 0,1 + 0 = 1,0 + 1 = 1 刚好与位运算的异或运算结果相同。
  • 进位值1 + 1 = 1,0 + 0 = 0,1 + 0 = 1,0 + 1 = 1 刚好与我们位运算的与运算结果相同。
  • 进位值需要向前进一位,与位运算左移运算符结果相同。
  • 未进位值与进位值计算。 还是采用异或。
  • 一直 while 循环到 进位值 为 0;
var add = function(a, b) {
    while(b)
    {
      var c = a ^ b;
      b = (a&b)<<1 ;
      a = c ;
    }
    return a;
}