Js位操作及其应用

访客3年前黑客工具777

我在看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


应用

先容完了几种操作符,来说说有啥应用。

136. 只泛起一次的数字

这是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米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

不需要对方同意的定位神器(不经对方同意的免费定位软件)

  回应 想着事168成: 和ip是有关系,但电脑版网页地形图最先要了解您ip的具体地址 才能够精准定位,这个时候必定就需要运用您的手机上,如今手机上一般都是有地形图或是别的地形图,要是您应用手机上位...

黑客接单网站,黑客找记录吗,黑客在哪里找老师

[1][2][3]黑客接单渠道Burp Suite 是用于浸透测验web 应用程序的集成渠道。 它包含了许多东西,并为这些东西规划了许多接口,以促进加速浸透应用程序的进程。 一切的东西都同享一个能处理...

祖孙三代收藏1万多个卷笔刀怎么回事?图片详情曝光令人大开眼界

祖孙三代收藏1万多个卷笔刀怎么回事?图片详情曝光令人大开眼界

近日,甘肃陇南市西和县一家人展示出其祖孙三代人收藏的1万多个卷笔刀,它们形状不一,造型各具特色。三代人痴迷于收藏卷笔刀,多年来去全国各地旅游时,别人去景区,他们却满大街寻觅逛文具店,购买卷笔刀回来...

维恩交易平台可以找黑客吗,黑客攻击传销网站

一、维恩交易平台可以吗怎么找黑客 1、查个银行账户黑客如果你想要有价值的网页,你必须有趣或有用的其他黑客。维恩交易平台可以吗模仿代码黑客事件受到前所未有的打击。查个银行账户接单黑客Web是一个很大的例...

找黑客帮忙定位手机号码位置(找黑客帮忙定位手机号码位置违法吗)

找黑客帮忙定位手机号码位置(找黑客帮忙定位手机号码位置违法吗)

...已经去派出所备案,只想知道如何能通过串号找到手机定位?_百度... 首先,每个手机都有唯一的身份标识(手机身份证),叫“串号”,显示为“IMEI”,一共15位(拨“*#06#”即可看到)。然后,...

鼻炎能治好吗(过敏性鼻炎到底能不能根治)

鼻窦炎能治好吗(过敏鼻炎究竟是否可以使除根)来源于:我国儿科专家同盟 先讨论一下这幅图,父母们是否感觉很了解?它是身患过敏鼻炎少年儿童的普遍姿势:用手自下往上搓鼻部。这一病症的学名字叫做“过敏行礼征”...