今天读书《You Don’t Know JavaScript》,读到强制类型转换一章,其内有提到了JavaScript中的位运算符,正好原来在模拟电路与数字电路课上接触过一些相关的原理,写此文整理一下

经过一番搜罗,基本上是这几个:

  • 按位与运算符:&
  • 按位或运算符:|
  • 按位异或运算符:^
  • 按位取反运算符:~
  • 右移运算符:>>
  • 左移运算符:<<

1. 按位与运算符:&

  • 性质:二元运算符
  • 用法:6 & 8 (操作数1 & 操作数2)
  • 规则:有 0 则为 0,双 1 则为 1
  • 原理:先将6和8转为二进制数,分别为0000 01100000 1000
// 根据规则:
// 11 -> 1
// 10 00 -> 00000 01100000 1000
-------------------0000 0000

得到结果为0000 0000,转回十进制数就是0


2. 按位或运算符:|

  • 性质:二元运算符
  • 用法:1 | 2 (操作数1 | 操作数2)
  • 规则:有 1 则为 1,双 0 则为 0
  • 原理:先将1和2转为二进制数,分别为0000 00010000 0010
// 根据规则:
// 10 11 -> 1
// 00 -> 00000 00010000 0010
-------------------0000 0011

得到结果为0000 0011,转换为十进制数后为3


3. 按位异或运算符:^

  • 性质:二元运算符
  • 用法:3 ^ 6 (操作数1 ^ 操作数2)
  • 规则:10为1,00、11为0(相同位结果为0,不同位结果为1)
  • 原理:将 3 和 6 转为二进制数,分别为0000 00110000 0110
// 根据规则:
// 10 -> 1
// 00 11 -> 00000 00110000 0110
-------------------0000 0101

得到结果为0000 0101,转换为十进制数后为5


4. 按位取反运算符:~

  • 性质:一元运算符
  • 用法:~1 (~操作数)
  • 规则
    • 正数按位取反(见4.1)
    • 负数按位取反(见4.2)

4.1 正数按位取反

规则如下:

  1. 首先将十进制正整数转换为二进制数,这里取1为例
    1 -> 0000 0001
  2. 其次将二进制的原码进行取反,得到结果为1111 1110
 0000 0001
-------------------1111 1110
  1. 此时1111 1110的第一位1为符号为,表示这个数的正负,1为负,0为正,这个符号位接下来不参与运算,也就是说我们要取除了第1位的后7位进行运算,此处为:111 1110,对这个操作数先取反再+1,就是我们最后得到的结果:
// 取反操作111 1110
-------------------000 0001
+  0000 0001   // 十进制的1转成二进制也就是 0000 0001
-------------------000 0010
  1. 拼接符号位与运算结果:1000 0010
    第一位符号位为1,表示这是一个负数,计算后面的二进制数得出结果为2,所以结果就是-2

4.2 负数按位取反

规则如下:

  1. 首先将十进制正整数转换为二进制数,这里取-2为例
    2 -> 1000 0010 因为是负数,所以第一位为1
  2. 保留第1位符号位,对后7位取反且+1
 000 0010
-------------------111 1101
+  0000 0001
-------------------111 1110
  1. 合并符号位与操作数后整体进行取反
 1111 1110
-------------------0000 0001
  1. 将运算后原码转换为十进制数:0000 0001 -> 1

5. 右移运算符:>>

  • 性质:二元操作符
  • 用法:3 >> 1 (操作数 >> 右移位数)
  • 规则:符号位不变,按位右移,左边补0
  • 原理:先把3转换为二进制数0000 0011
 0  |000 0011|
-------|--------|----0  |000 0001|1 // 最后一位的1因为右移被挤掉了,左边补一个0,因为二进制数的位数是固定的

所以最后得到的结果就是:0000 0001,转换为十进制数就是1


6. 左移运算符:<<

  • 性质:二元操作符
  • 用法:1 << 2 (操作数 << 左移位数)
  • 规则:符号位不变,按位左移,右边补0
  • 原理:基本的原理与右移运算符一样,先把1转换为二进制数0000 0001
 0   |000 0001|
--------|--------|-0 00|000 0100|   // 左移2位,左边被挤掉2个0,右边补两个0

所以最后得到的结果就是:0000 0100,转换为十进制数为4

如果这里你跟着写了一遍的话,你会发现:我们可以使用1 << x来求2的x次幂,比Math.pow(2, x)要简洁


小结

虽然平时基本上并不会接触到位级的运算,但该了解的还是要了解到,经常在网上看到JavaScript奇技淫巧用到位运算符,计算机博大精深,路还长,保持向前。

JS中的按位运算符们相关推荐

  1. js中的按位运算符详解‘‘ , ‘|‘, ‘^‘, ‘~‘, ‘<<‘, ‘>>‘, ‘>>>‘

    一.什么是按位运算符 按位运算符是JavaScript中的一组二进制运算符,用于对数字的二进制表示进行操作.按位运算符会将操作数转换成二进制形式,然后对它们的每一位进行比较和计算,最终得出运算结果. ...

  2. python位运算符_详细介绍Python语言中的按位运算符

    按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下: 按位与 ( bitwise and of x and y ) & 举例: 5&3 = 1 解释: 101 ...

  3. java中常用的位运算符及其应用

    1.位运算就是直接对整数在内存中的二进制位进行操作,针对与int类型进行操作 Java中常用的位运算符有以下7种:     &      |        ^   ~   <<   ...

  4. javascript运算符_JavaScript中的按位运算符

    javascript运算符 JavaScript按位运算符 (JavaScript Bitwise Operators) A lot of times you come across some str ...

  5. Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)

    一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button οnclick="javas ...

  6. c语言 ++ --运算符_C / C ++中的按位运算符

    c语言 ++ --运算符 In any programming language, operators carry out manipulations and operations on the op ...

  7. 逻辑运算符 位运算符_在现代PHP中,按位运算符仍然有意义吗?

    逻辑运算符 位运算符 Many of you probably scratched your heads reading this title. "Bitwhat?" 你们中的许多 ...

  8. python语言中运算符号_详细介绍Python语言中的按位运算符

    <从问题到程序:用Python学编程和计算>--2.11 补充材料 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者:裘宗燕 ...

  9. JS中生成8位的随机数字

    场景 前端使用websocket连接服务端时,后缀添加一个随机的8位数字,确保多个浏览器能同时访问. 注: 博客: BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,Sp ...

最新文章

  1. (C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值
  2. 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
  3. 第十五届全国大学生智能汽车竞赛-室外光电ROS组预赛方案
  4. SSH实现论坛BBS系统
  5. Ninja提升编译速度的方法-Android10.0编译系统(十)
  6. 宜昌高新区三峡云计算机大楼,【智慧宜昌】CREATOR快捷CS分布式系统成功入驻三峡云计算中心...
  7. C++ 类的保护继承与构造函数
  8. PHP中的多行字符串传递给JavaScript方法两则
  9. Win7+Ubuntu双系统启动项修复总结
  10. Java内存模型、volatile、原子性、可见性、有序性、happens-before原则
  11. PrintWriter和ServletOutputStream的区别
  12. PHP中的加强型接口Traits
  13. 根据从日期控件选定的时间以表格形式显示数据_VB项目开发FlexGrid控件使用讲解...
  14. php图片上传不现实路径指向错误,上传图片提示这个错误怎么办?
  15. Qt Mysql驱动编译过程以及驱动下载
  16. mysql关于数据是datetime类型
  17. Linux基础-1.Linux命令及获取帮助
  18. android 平板刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机
  19. SonyZ2国行版L50t使用谷歌play服务安装谷歌四件套
  20. 【音频】音频文件格式以及相关参数

热门文章

  1. python中fillna_Python pandas.DataFrame.fillna函数方法的使用
  2. TCP三次握手_带图
  3. html中iOS的图标问题apple-touch-icon等
  4. python编程图_如何使用Python编程图形的X / Y图
  5. 【java保留两位小数并舍去.00】
  6. cad修改标注尺寸方法
  7. js中字符串的方法:replace;替换字符串中的某个字符
  8. PS教程:表情包是这样制作出来的
  9. 怎么彻底清除计算机病毒,如何彻底清除默认恶意主页?
  10. 机器学习--监督学习以及无监督学习案例