奇技淫巧:指过于奇巧而无益还让人着迷的技艺与制品。

And(与) &
Or(或) |
Exclusive Or(异或)

或者称 Xor

^
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()' 更快。

Math.floor() 运行速度 是 3.5 millions ops/sec

~~的运行速度是 3.8 millions ops/sec

但是 ~~ 只适用于 32位 以下的整型,对于 超过32位的 整型 还是要用 Math.floor()

javascript奇技淫巧之位运算符的更多相关文章

  1. Javascript中的位运算符和技巧

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...

  2. js 位运算符

    MDN定义:位运算符将它的操作数视为32位元的二进制串(0和1组成)而非十进制八进制或十六进制数. 例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准 ...

  3. js中的位运算符 ,按位操作符

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

  4. javascript运算符——位运算符

    × 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...

  5. JavaScript位运算符 2

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是“位”: 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内 ...

  6. JavaScript按位运算符~

    1. JavaScript按位运算符 Bit operators work on 32 bits numbers. 2. JavaScript按位运算符~ 值得注意的是,在JavaScript中,~5 ...

  7. JavaScript位运算符

    位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 重温整数 ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript ...

  8. javascript的变态位运算

    javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...

  9. JavaScript奇技淫巧45招

    JavaScript奇技淫巧45招 撰写于 2015年1月5日 修改于 2016年6月16日 分类 翻译 标签 JavaScript 本文是一篇翻译文章,原文信息如下: 原文:45 Useful Ja ...

随机推荐

  1. 利用 PHP 导出 Git 某个分支下,新增或修改过的文件

    使用 SVN 作为版本控制的时候,整理过一个 导出文件脚本:利用 PHP 导出 SVN 新增或修改过的文件 现在换成了 Git,整理出类似的脚本: [第一版]git.php <?php /** ...

  2. ARM 编程平台+coresight

    http://www.keil.com/product/ DS-5:http://www.cnblogs.com/njseu/p/6023081.html http://www.arm.com/pro ...

  3. UVA12304-2D Geometry 110 in 1!

    就是给了六个关于圆的算法.实现它们. 注意的是,不仅输出格式那个符号什么的要一样.坐标的顺序也要从小到大-- 基本上没考虑什么精度的问题,然后就过了. 大白鼠又骗人.也许我的方法比較好? 我的做法就是 ...

  4. Creating Reusable XAML User Controls with Xamarin Forms

    In the previous post on making fancy layouts with Xamarin Forms we saw how you can design a Dashboar ...

  5. AngularJS如何编译和呈现页面

    AngularJS如何编译和呈现页面? 页面加载,首先加载静态DOM,AngularJS随即加载,并寻找在页面的ng-app,然后开始编译所有moudlue内的所有service, controlle ...

  6. canvas使用2

    文字对齐方式 : 水平对齐 ? 1 2 3 4 //是用 textAlign 属性设置水平对齐方式(默认坐标点) ctx.textAlign = "start"; ctx.font ...

  7. Spring主从数据库的配置和动态数据源切换原理

    原文:https://www.liaoxuefeng.com/article/00151054582348974482c20f7d8431ead5bc32b30354705000 在大型应用程序中,配 ...

  8. C#编程(六十七)----------LINQ提供程序

    原文链接:http://blog.csdn.net/shanyongxu/article/details/47257511 LINQ提供程序 .NET3.5包含了几个LINQ提供程序. LINQ提供程 ...

  9. python测试开发django-37.外键(ForeignKey)查询

    前言 前面在admin后台页面通过设置外键,可以选择下拉框的选项,本篇主要讲解关于外键(ForeignKey)的查询 models设计 在上一篇的基础上新增一个BankName表,Card表通过外键关 ...

  10. Linux学习4-阿里云服务器(CentOS)下使用 Tomcat安装 Jenkins

    前言 通常做自动化测试,需要用到jenkins来做持续集成,那么linux系统里面如何使用tomcat安装Jenkins环境呢? 前面一篇已经搭建好java和tomcat环境,接着直接下载jenkin ...