美文网首页
JS里的逻辑位运算符与加减法

JS里的逻辑位运算符与加减法

作者: 方_糖 | 来源:发表于2019-12-24 10:22 被阅读0次

一、逻辑位运算符的介绍

参考: http://c.biancheng.net/view/5469.html

1 、与运算符:&

有0取0,无0取1

第一个数的位值 第二个数的位值 运算结果
1 1 1
1 0 0
0 1 0
0 0 0
console.log(1&2)  // 01&10 =00  : 0
2 、与运算符:|

有1取1, 无1取0

第一个数的位值 第二个数的位值 运算结果
1 1 1
1 0 1
0 1 1
0 0 0
console.log(1|2)  // 01|10=11  : 3
3、异或运算符:^

相同为0,相异为1

第一个数的位值 第二个数的位值 运算结果
1 1 0
1 0 1
0 1 1
0 0 0
console.log(1^2)  // 01^10 =11  : 3
4、非运算符:~

~x = - (x + 1)
位非运算实际上就是对数字进行取负运算,再减 1。例如:
~2 = -3
~5 = -6
~(-10) = 9

一、利用位运算符实现加减法

参考:http://zouyang1230.com/blog/archives/805

1. 加法运算
  • 实现:
//加法实现
function add(a,b){
  if(a == 0 || b == 0){
    return a||b
  }
  var num;
  while(b != 0){
    num = a ^ b;      //异或:不看进位的结果
    b = (a & b) << 1; //与运算且向左移一位:只看进位的结果 
    a = num;           
  }
  return a;
}
  • 分析:
    假设 a = 9, b = 1
  1. 我们首先看十进制是怎么实现的加法运算
    9 + 1
  • 先相加不算进位得到: 0
  • 相加只算进位得到 :1
  • 进位要乘10得到:10
  • 相加不算进位的结果 + 相加只算进位的结果:10 + 0 = 10
  1. 二进制实现
    同理我们可以进位与不进位的结果相加
    a 转换为二进制后为 1001
    b 转换为二进制后为 0001
  • 先相加不算进位得到:1000
  • 相加只算进位得到:0001
  • 进位要左移一位得到:0010
  • 相加不算进位的结果 + 相加只算进位的结果:1000 + 0010 = 1010

而二进制中相加不进位的运算和 ^(异或:相同为0,不同为1) 的运算一样
二进制中的相加进位的运算和 &(与运算:都为1则取1,否则为0)的运算一样
但是在实现 “相加不算进位的结果 + 相加只算进位的结果” 时,可能相加后又有进位:
就像1111 + 0001

  • 先相加不算进位得到:1110
  • 相加只算进位左移一位得到:0010
  • 计算相加不算进位的结果 + 相加只算进位的结果: 1110 + 0010
  • 先相加不算进位得到:1100
  • 相加只算进位左移一位得到:0100
  • 计算相加不算进位的结果 + 相加只算进位的结果: 1100 +0100
    ....
    如此循环,所以只有 “相加只算进位” 得到的结果为0时,就可以结束计算,而最终的计算结果就是 “相加不算进位” 得到的结果。
2. 减法运算
  • 实现:
function sub(a,b){
  if(a == 0 || b == 0){
    return a || -b
  }
  b = ~ b;
  var num;
  while(b != 0){
    num = a ^ b;
    b = (a & b) << 1;
    a = num;
  }
  return a + 1;
}
  • 分析:
    减法运算可以变成加法运算
    11 - 1 = 11 + (-1)
    只是在这里 1 怎么变成 -1 呢?就要用到我们的 ~ (非运算)
    ~1 = -(1+1)
    所以可以直接套用加法运算 ,只需要在最后的结果再加 1 即可。
    另:要注意当 a = 0 时,返回的是-b

相关文章

网友评论

      本文标题:JS里的逻辑位运算符与加减法

      本文链接:https://www.haomeiwen.com/subject/okhtoctx.html