我在看lodash实现一些工具函数的源码时发现lodash界说了一些bitMask的常量。我一开始没弄明这是什么鬼器械,用Google搜了一圈才发现是我之前接触过得位操作运算一类的器械。而且源码和我搜索的资料给我提供了另一种使用场景,感受应用性照样蛮强的,以是爽性总结一下好了。
先以下面的表达式睁开需要领会的基础知识。
// lodash 源码里界说的常量 var CLONE_DEEP_FLAG = 1
JavaScript遵照 IEEE 754 尺度,无论是整数照样小数都是用双精度浮点数表述,双精度浮点数8个字节,示意64位二进制位,以是双精度浮点数的示意局限是-2^63 ~ 2^63-1。然则在举行位操作时则是用的32位数示意,也就是4个字节,示意局限为`-2^31 ~ 2^31-1,其中无论是32位照样64位,更高位都是符号位,0示意正数,1示意负数。
上面的表达式在举行位操作就会转换成下面这种,若是跨越32位了,那跨越的部门就会所有省去。
00000000 00000000 00000000 00000001
下面先容几种常用的操作符。
let a = 1, b = 2 console.log(a & b) // 0 // 0001 // 0010 // = 0000
把变量a和变量b都睁开成32位二进制数,省去前面的0,a的二进制示意为0001,b为0010,接着就是对应位数的二进制位对照,若是相同就是1,否则为0。
let a = 1, b = 2 console.log(a | b) // 3 // 0001 // 0010 // = 0011
参照上面一种,差别的是相同的二进制位上,只要有一个是1,则效果就是1,以是就是0011。
这个和|有点区别,相同的地方在于若是统一位数上的数只要一个是1,则这个位数的效果就是1,差别的地方在于相同的位数上若是数值相同,则效果为0.
let a = 1, b = 2 console.log(a ^ b) // 3 // 0001 // 0010 // = 0011 let c = 3, d = 3 console.log(a ^ b) // 0 // 0011 // 0011 // = 0000
这个和之前三个更大的区别是对单个数的操作,而不是两个数的对照效果。简朴来说就是取反,对二进制上的每一位都取反。然则这里有个有趣的征象。
let a = 1; console.log(~ a) // -2
无论用~取反任何数,得出的都是负数,而且是在正数上加一的负数。这里涉及三个观点:原码,反码,补码。首先明确一点,负数是以补码的形式存在的。
正数和负数的都是转换成二进制数后的样子,差别的是负数的原码在更高位+1。
// 4的原码 00000000 000000000 000000000 00000100 // -4的原码 10000000 000000000 000000000 00000100
正数的反码和正数的原码一致。但负数的反码是对除了符号位上的其他二进制位取反。
// 4的反码 00000000 000000000 000000000 00000100 // -4的反码 11111111 11111111 11111111 11111011
正数的补码照样和正数的原码一致,但负数的补码是在负数反码的基础上对最后一位加1。
// 4的补码 00000000 000000000 000000000 00000100 // -4的补码 11111111 11111111 11111111 11111100
以是说回上面提到的问题,3被~转换为-4的历程。
3:00000000 00000000 00000000 00000100 ~3:11111111 11111111 11111111 11111011 // ~3 这时刻示意的是负数,那就根据原码->补码的顺序倒推 // 1.更低的位数-1 11111111 11111111 11111111 11111010 // 2.取反(除了符号位) 10000000 00000000 00000000 00000101 // 3.转换成十进制 -4
先容完了几种操作符,来说说有啥应用。
这是LeetCode上的一道题,问题是这样写的:
给定一个非空整数数组,除了某个米素只泛起一次以外,其余每个米素均泛起两次。找出谁人只泛起了一次的米素。这个用上面先容过的^(异或)操作符是最容易解答的,可以可以下^的特征。问题里说的是只有一个数是唯一的,其他都是两两泛起,而相同的数字,就像我上面举例用了两个3,效果是0,由于每个二进制上的数都相同,以是效果就是每个位上都变成了0.
function onlyNums(arr){ return arr.reduce((all,item) => all ^ item) }
这个例子就和我们的一样平常贴的对照近了。后台系统举行权限设置的时刻,一样平常可能就是界说几个字符串界说差别的权限,若是一个人同时有许多权限,效果可能是个数组,也可能是把差别权限字符串拼接成新的字符串。
let permission1 = 001 // 登录权限 let permission2 = 002 // 建立权限 let permission3 = 003 // 删除权限 let adminPermission = '001,002,003' // or let adminPermission = [001,002,003]
若是换成位操作的思绪:
let permission1 = 1 // 登录权限 let permission2 = 2 // 建立权限 let permission3 = 4 // 删除权限 let permission4 = 8 // 编辑权限 let adminPermission = (permission1 | permission2 | permission3)
这个时刻检查adminPermission是否拥有某个权限就可以这样:
if((adminPermission & permission1) === permission1){ // 有登录权限 }
删除某个权限:
adminPermission = adminPermission & (~ permission2)
新增某个权限:
adminPermission = adminPermission | permission4
除了上面两种场景,位操作
1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
seo又很好学吗?seo简单吗?seo赚钱吗?近期在群里常常见到这类难题,一时间感觉这种难题非常值得每一个提升人去思索,就在今天来讲本人对seo的了解还并不是很深入,都没有运用seo赚到要多少钱。可以...
鬼谷八荒怎么快速的刷灵石,词穷了词穷了,这两天小编的脑子里全部都是这款游戏,这个物品在什么位置,那个boss怎么打,游戏的攻略确实装满了整个脑袋,谁让这款游戏在最近一段时间里风头那么足呢,就连从不玩这...
赚钱app哪个最靠谱微信提现 可以赚钱并提现到微信的软件推荐:小啄赚钱支持安卓和苹果手机,上手极为容易,注册下载之后,跟着新手指引就能很快提现了,支持微信和支付宝,可以说是非常适合大家入门的一个项目了...
大伙儿了解,假如客户沒有启用百度云盘的vip会员管理权限,就没法在线解压网盘里的压缩包。对于这类状况,我来支一招,不用vip会员就可以在线解压文档,此方式只限iPhone手机使用。 iPhone客户...
本文目录一览: 1、著名的黑客事件都有哪些 2、全球最为严重的黑客入侵事件有哪几起? 3、世界上著名的黑客事件有那些~ 4、历史上最著名的几次黑客事件 5、盘点一下,有哪些著名的黑客入...
宝宝的吃奶的时候稍不注意就会引起呛奶,只要妈妈平时多注意是可以预防宝宝呛奶的,那么在宝宝吃奶时有哪些预防宝宝呛奶的方法呢,如果宝宝呛奶了怎么办。 宝宝总是呛奶怎么办 应将宝宝俯卧在父母腿上,让他上...