And(与) | & |
Or(或) | | |
Exclusive Or(异或) |
^ |
Not(非) | ~ |
位运算符,我们在日常js开发中其实 说真的,很少会用到,甚至可以说 有相当一部分的 javascripter完全不知道 位运算符
但是我们日常中肯定常常会用到 '&&'、'||'、'!' 这么几个符号,它们看起来跟位运算符很像,但是 它们并不是位运算符,它们只运用在 ‘boolean 布尔值’运算中
曾几何时我曾疑惑过 为什么 我们 在 js中 做条件判断的时候 ‘and’是用‘&&’而不是‘&’
虽然说 我们日常开发中 很多js原生方法能满足我们了,但是适当掌握一些 位运算 能提高你的开发效率和代码性能
在这里我们不探讨 位运算符的原理,有兴趣的可以自行谷歌
Not ~
Not 实质上 是对数字向下取整求负 再 减1
var num = 20.1
console.log(~num) // -21
And &
这个 就有点复杂了
对数字的二进制形式进行运算。它把每个数字中的数位对齐,然后用下面的规则对同一位置上的两个数位进行 AND 运算:
第一个数字中的数位 | 第二个数字中的数位 | 结果 |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
举例: 30 & 3
我们先来看下两个数的 二进制
var i = 30
i.toString(2) // 11110
var j = 3
j.toString(2) // 11
console.log(i & j) // 2
为什么是‘2’?
我们来看一下, 按照上表的关系 我们可以得出 下表结果
30 | 1 1110 |
3 | 0 0011 |
结果 | 0 0010 |
二进制 ‘10’ 对应的 十进制数就是 ‘2’了
Or |
or跟and 相似 也是 转为二进制之后 进行的 计算 不过规则不同
第一个数字中的位数 | 第二个数字中的位数 | 结果 |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
同样的 我们拿 30 | 3来举例
var i = 30
i.toString(2) // 11110
var j = 3
j.toString(2) // 11
console.log(i | j) // 31
30 | 1 1110 |
3 | 0 0011 |
结果 | 1 1111 |
Exclusive Or ^(或者称 Xor)
也是类似 or 和 and 一样 不过规则不同
第一数字中的位数 | 第二数字中的位数 | 结果 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
var i = 30
i.toString(2) // 11110
var j = 3
j.toString(2) // 11
console.log(i ^ j) // 29
30 | 1 1110 |
3 | 0 0011 |
结果 | 1 1101 |
那么 看了这4个 基本运算之后,
究竟我们的 奇技淫巧在哪呢?
我们再回到 Not 运算符上,可以说 And Or Xor 这三个位运算 我们用到的可能性比较小
但是 Not 的 法则 是 向下取整 后 求负 减1
注意我 着重标出的 关键字,是不是想到了什么?没错 Math.floor()
如果说 单次 使用 Not 是 求负减1 那么 我连续使用 2次 Not 会怎么样呢?对于 整型 的数字来说 连续两次 就是它本身,那么对于浮点型的数字呢? 那岂不就是 他的向下取整了么?
为了验证 我们可以试一下
var i = 25.1
console.log(~~i) //25
但是又有人说 向下取整 不是有 Math.floor() 方法么?
好了 这就是我们奇技淫巧了 为什么要用 两次 Not 而不用 Math.floor()
第一,你不觉得 ‘~~’ 输入起来 比 'Math.floor()' 快么?
第二,就是 '~~' 比 'Math.floor()' 更快。
相关推荐
1、首次为变量赋值时务必使用var关键字 2、使用===取代== 3、underfined、null、0、false、NaN、空字符串的逻辑结果均为false
JavaScript是一个绝冠全球的编程语言,可用于Web开发、移动应用开发(PhoneGap、Appcelerator)、服务器端开发(Node.js和Wakanda)等等。JavaScript还是很多新手踏入编程世界的第一个语言。既可以用来显示浏览器中...
RocketMQ 奇技淫巧之 ServiceLoader 源码解读 抓下来打包成了HTML文件, 方便离线观看
算法心得-高效算法的奥秘(原书第2版)_带书签_高清_[位运算的奇技淫巧].pdf.
Python 语言有什么奇技淫巧吗?.docxPython 语言有什么奇技淫巧吗?.docxPython 语言有什么奇技淫巧吗?.docxPython 语言有什么奇技淫巧吗?.docxPython 语言有什么奇技淫巧吗?.docxPython 语言有什么奇技淫巧吗?....
《Python那些事——python的奇技淫巧!》python2.7版本
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 试一下就知道这段代码的意思就是声明一个函数,然后立刻执行,因为Javascript中的变量作用域是基于函数的,所以这样可以避免变量污染,但这里的位运算符“~”乍一看...
EVAL长度限制突破技巧 命令长度限制突破技巧 Mysql突破换行符的技巧 命令执行WAF绕过技巧 无字母数字Webshell构造技巧
DNS服务作为网络的一种基础架构,在网络中有举足轻重的地位。它担负着整个网络用户计算机的名称解析工作。没有正确的名称解析,服务器就无法识别各客户机。我们日常进行的浏览网页等上网活动,无一例外都在使用DNS...
bash奇技淫巧,长见识
收集到的一些src挖掘奇技淫巧
主要介绍了ASP.NET Core 奇技淫巧之接口代理转发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
编程是一件很快乐的事,实现一个目的,我们可以有很多方法路径,在这篇文章我们介绍一些JavaScript的奇技淫巧,仅供大家参考,各路大神在平时的代码编写时,如很多简洁高效的书写方式; 下面话不多说了,来一起看看...
主要介绍了CSS中边框使用负边距值的奇技淫巧,文中介绍了使用负边距进行布局以及实现重叠等效果的方法,非常之巧妙,需要的朋友可以参考下
移动端Ui自动化上的一些“奇技淫巧”;工作上总结的一些好用的东西在这里分享给大家 : )
一直以来,使用纯 CSS 实现波浪效果都是十分困难的。 因为实现波浪的曲线需要借助贝塞尔曲线。 而使用纯 CSS 的方式,实现贝塞尔曲线,额,暂时是没有很好的方法。 当然,借助其他力量(SVG、CANVAS),是可以很...
Git是一个 “分布式版本管理工具”,简单的理解版本管理工具:大家在写东西的时候都用过 “回撤” 这个 功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用 “回撤” 是找不回来的。...