美文网首页
理解js中的位运算

理解js中的位运算

作者: 朝西的生活 | 来源:发表于2018-11-26 16:28 被阅读0次
  1. & 按位与
    && 运算符我们都知道,只有两个都为真,结果才为真。& 道理是一样的,只有两个数的值为1时,才返回1。
    &是二元运算符,如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0。将1 & 3按位与, 表达式如下:
  0 0 0 0 0 0 1
& 0 0 0 0 0 1 1
---------------
  0 0 0 0 0 0 1

eg: 判断一个数是奇数还是偶数

// old
function isEvenOrOdd(n) {
  return n % 2 === 1
}
// new 
function isEvenOrOdd(n) {
  return n & 1
}

奇数的二进制码的最后一位数肯定是1,而1只有最后一位为1,按位&操作之后,结果肯定只有最后一位数为1。而偶数的二进制表示的最后一位数是0,和1进行按位&操作,结果所有位数都为0。

我们平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更高的

  1. | 按位或
    |||操作符的道理也是一样的,只要两个数中有一个数为1,结果就为1,其他则为0。
    对于浮点数的向下取整, 我们可以使用 | 来完成
// old
Math.floor(1.1); // 1
// new 
1.1 | 0; // 1

其实浮点数是不支持位运算的,所以会先把1.1转成整数1再进行位运算,就好像是对浮点数向下求整。所以1|0的结果就是1。

  1. ~ 按位非
    按位非就是求二进制的反码
var num = 1; // 二进制 00000000000000000000000000000001
var num1 = ~num; // 二进制 11111111111111111111111111111110
  1. ^ 按位异或
    按位异或是两个数中只有一个1时返回1,其他情况返回0。
    数字与数字本身按位异或操作得到的是0,因为每两个对应的数字都相同,所以最后返回的都是0。我们可以利用这个特性来判断两个数字是否相等
function isEqual(n){
  return n ^ n === 0
}

或者交换两个数字

var num1 = 1, num2 = 2;
num1 ^= num2; // num1 = num1 ^ num2 = 1 ^ 2 = 3
num2 ^= num1; // num2 = num2 ^ (num1 ^ num2) = 2 ^ (1 ^ 2) = 1
num1 ^= num2; // num1 = num1 ^ num2 = 3 ^ 1 = 2
console.log(num1); // 2
console.log(num2); // 1
  1. << 有符号左移

有符号左移会将32位二进制数的所有位向左移动指定位数。如:

var num = 2; // 二进制10
num = num << 5; // 二进制1000000,十进制64

如果要求2的n次方,可以这样:

function power(n) {
    return 1 << n;
}
power(5); // 32

1的二进制是01,左移5位就是0100000,十进制就是2的5次方32。

  1. >> 有符号右移
    有符号右移会将32位二进制数的所有位向右移动指定位数。如:
var num = 64; // 二进制1000000
num = num >> 5; // 二进制10,十进制2

求一个数的二分之一:

var num = 64 >> 1; // 32

有符号左移与右移不会影响符号位。

  1. >>> 无符号右移
    正数的无符号右移与有符号右移结果是一样的。负数的无符号右移会把符号位也一起移动,而且无符号右移会把负数的二进制码当成正数的二进制码
    所以,我们可以利用无符号右移来判断一个数的正负:
function isPos(n) {
return (n === (n >>> 0)) ? true : false;    
}

isPos(-1); // false
isPos(1); // true

-1>>>0虽然没有向右移动位数,但-1的二进制码已经变成了正数的二进制码 11111111111111111111111111111111

相关文章

  • 理解js中的位运算

    & 按位与&& 运算符我们都知道,只有两个都为真,结果才为真。& 道理是一样的,只有两个数的值为1时,才返回1。&...

  • js中的位运算

    在了解位运算之前, 必须先了解一下什么是原码, 反码和补码, 以及二进制与十进制的转换. 原码一个数在计算机中是以...

  • js 中位运算的应用

    按位运算符有6个: 按位与 & 按位或 | 按位异或 ^ 取反 ~ 右移 >> 左移 << 应用...

  • 【转+补充】深入研究js中的位运算及用法

    转载自【博客园-不疯魔不成活】 《深入研究js中的位运算及用法》 什么是位运算? 位运算是在数字底层(即表示数字的...

  • js位运算

    极简主义 位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。 http://www.w3school....

  • 位运算 理解

    位运算的目的 位运算举例 位运算进一步理解 PS: 以上全部来源于:【程序员修炼之道】书中。

  • Js中什么是位运算?

    位运算一直不太懂,所以找了个时间把这个学习了,如果有写的不好请评论联系我纠正 什么是位运算? 位运算是在数字底层(...

  • 运算符

    运算符 JS中为我们定义了一套对数据进行运算的运算符。 这其中包括:算数运算符、位运算符、关系运算符等。 算数运算...

  • js基本语法

    运算符: JS中我们定义了一套对数据进行运算的运算符。 这其中包括:算数运算符,位运算符,关系运算符。 算术运算符...

  • 10_day JavaScript基本语法

    运算符: JS中我们定义了一套对数据进行运算的运算符。 这其中包括:算数运算符,位运算符,关系运算符。 算术运算符...

网友评论

      本文标题:理解js中的位运算

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