javascript奇技淫巧之位运算符
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()' 更快。
Math.floor() 运行速度 是 3.5 millions ops/sec
但是 ~~ 只适用于 32位 以下的整型,对于 超过32位的 整型 还是要用 Math.floor()
javascript奇技淫巧之位运算符的更多相关文章
- Javascript中的位运算符和技巧
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...
- js 位运算符
MDN定义:位运算符将它的操作数视为32位元的二进制串(0和1组成)而非十进制八进制或十六进制数. 例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准 ...
- js中的位运算符 ,按位操作符
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...
- javascript运算符——位运算符
× 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...
- JavaScript位运算符 2
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是“位”: 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内 ...
- JavaScript按位运算符~
1. JavaScript按位运算符 Bit operators work on 32 bits numbers. 2. JavaScript按位运算符~ 值得注意的是,在JavaScript中,~5 ...
- JavaScript位运算符
位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 重温整数 ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript ...
- javascript的变态位运算
javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...
- JavaScript奇技淫巧45招
JavaScript奇技淫巧45招 撰写于 2015年1月5日 修改于 2016年6月16日 分类 翻译 标签 JavaScript 本文是一篇翻译文章,原文信息如下: 原文:45 Useful Ja ...
随机推荐
- Golang Vendor 包机制 及 注意事项
现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...
- 新玩的windows phone app studio
其实我是一直想开发windows phone 8平台的应用的,奈何开始windows phone 8开发却是不是件容易的事.Windows phone 8的开发其实是对计算机的硬件有要求的,首先要装w ...
- [转载]vs2017与docker
基本需求 系统 win10 vs2017 docker 步骤 1.开启系统的hyper-v 2. 重启电脑 3.安装docker 下载地址:https://docs.docker.com/docker ...
- clientX, clientY,offsetX, offsetY,screenX, screenY, x, y
clientX, clientY是鼠标当前相对于网页的位置,当鼠标位于页面左上角时clientX=0, clientY=0: offsetX, offsetY是鼠标当前相对于网页中的某一区域的位置,当 ...
- 关于unity里pbr技术和材质 unity5默认shader和传统的对比
刚开始也不知道什么是pbr (Physically Based Rendering)后来才发现这是一种新的渲染方式 与之对应的是材质是pbs(Physically Based Shader) unit ...
- java项目实现流水号自动增长
项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001. 实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储: 业务获取新的编码,考虑并发问题,获取编 ...
- Oracle初级索引学习总结
前言 索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度.它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能.虽然有许多资料讲索引的用法,DBA和Develop ...
- 《SEO教程:搜索引擎优化入门与进阶(第3版)》
<SEO教程:搜索引擎优化入门与进阶(第3版)> 基本信息 作者: 吴泽欣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115357014 上架时间:2014-7-1 出 ...
- vue elementui switch开关控件的使用
<el-switch @change="test" on-value="1" off-value="0" v-model=" ...
- 使用Numpy验证Google GRE的随机选择算法
最近在读<SRE Google运维解密>第20章提到数据中心内部服务器的负载均衡方法,文章对比了几种负载均衡的算法,其中随机选择算法,非常适合用 Numpy 模拟并且用 Matplotli ...