美文网首页
JS位运算应用场景

JS位运算应用场景

作者: 景阳冈大虫在此 | 来源:发表于2021-06-10 15:46 被阅读0次

准备知识

2进制和16进制

  • 0x开头是16进制
0x2000000
  • 0b开头是2进制
export const Deletion = 0b00000000000000001000;

进制转换

数字转换成字符串

numObj.toString([radix])

  • 十进制转换成二进制
var num=100;
num.toString(2); // "1100100"

解析一个字符串并返回指定基数的十进制整数

Number.parseInt(string[, radix])

  • 16进制转换成十进制
var num=2000000; 
parseInt(num,16); // 33554432

计算

&:按位与

var a = 0b100;
var b = 0b1100;
var res = a & b;
console.log(res.toString(2));// 100

|:按位或

var a = 0x100;
var b = 0x2000;
var res = a | b;
console.log(res.toString(16));// 2100

应用场景

描述

用于表示各种状态的叠加态

通常解法

通俗一点说,今天吃的水果沙拉有西瓜、芒果、草莓。
那用js怎么表示这样的状态呢?通常情况我们肯定是使用数组:

var watermelon = '1';
var mango = '2';
var strawberry = '3';

var salad = [watermelon, mango, strawberry];

判读沙拉里是否有芒果

salad.includes(mango);

这样有啥问题吗?
又不是不能用,倒也没啥大的问题。但是对于一段高频代码来说,使用数组反复做push、pop、includes这种操作只是为了维护某个状态,并不是最优解。

位运算解法

flags

在React中有这样的应用。
fiber可以理解为React中虚拟Dom节点,使用fiber.flags来描述该节点要执行DOM操作的具体类型。

/* react/packages/react-reconciler/src/ReactFiberFlags.js */
// DOM需要插入到页面中
export const Placement = /*                    */ 0b00000000000000000010;
// DOM需要更新
export const Update = /*                       */ 0b00000000000000000100;
// DOM需要插入页面中并更新
export const PlacementAndUpdate = /*           */ Placement | Update;
// DOM需要删除
export const Deletion = /*                     */ 0b00000000000000001000;

bitField

bluebird中对于promise状态的部分描述如下

/* bluebird-master/src/constants.js */
CONSTANT(IS_FULFILLED, 0x2000000|0);
CONSTANT(IS_REJECTED, 0x1000000|0);
CONSTANT(WILL_BE_CANCELLED, 0x800000|0);
CONSTANT(IS_FINAL, 0x400000|0);
CONSTANT(IS_BOUND, 0x200000|0);
/* bluebird-master/src/promise.js */
Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | IS_FULFILLED;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & IS_FOLLOWING) === IS_FOLLOWING;
};

状态判定

commitMutationEffects

水果沙拉位运算应用

观察上面的例子,可以把数组解法改成这样

var watermelon = 0b001;
var mango = 0b010;
var strawberry = 0b100;

var salad = watermelon| mango|strawberry;

var res = (salad & mango) === mango;
console.log(res); // true

最大整数范围

js中能表示的最大整数为2^53
所以使用这个方法按每个状态只有一个1来算,能存53个状态。

THE END

相关文章

  • JS位运算应用场景

    准备知识 2进制和16进制 0x开头是16进制 0b开头是2进制 进制转换 数字转换成字符串 numObj.toS...

  • 位运算及其应用场景

    概念理解 按位与 & :全1为1,有0为0 假设 1:true,0:false,联想Java中的&&运算符,只有两...

  • js 中位运算的应用

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

  • js位运算

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

  • 位运算应用

    取模 由于偶数的最低位为 0,奇数为 1,所以取模运算可以用位操作来代替。 取整 位掩码 通过定义这些选项,可以用...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 比较运算符

    前端学习分享(js中比较运算符的使用) 本文旨在搞清楚比较运算符的用法和场景,在js中比较运算符有以下8个 == ...

  • JS中的位移运算

    快速理解位运算: 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用 位运算只针对整数...

  • 位运算(位掩码BitMask)的简单应用场景浅析

    在Java中,位运算符有:与(&)、非(~)、或(|)、异或(^)、移位(<< 和 >>)、无符移位(<<< 和 ...

  • 位运算数学意义及应用场景

    简介 梳理一下位运算定义、数学意义以及它的应用场景,在日常编码中能给我们带来什么提升。 运算定义 了解原码反码和补...

网友评论

      本文标题:JS位运算应用场景

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