JS位运算符

整数

  • 有符号整数:允许使用正数和负数,第32位作为符号位,前31位才是存储位
  • 无符号整数:只允许用正数

  • 如果用n代表位
  • 位数 = 2^n-1
  • 由于位数(1、2、4、8、16...)中只有第一位| 1 |是奇数,所以可以根据第一位| 1 |的数值判断一个数值是奇数还是偶数
  • num % 2运算本质就是取的| 1 |的值,如果是1就是奇数,是0就是偶数

补码和反码

  • 确定该数字的非负版本的二级制表示const getBinary = num => num.toString(2)
  • 求得二进制反码,反码就是把原来的二进制1,0互换。即要把 0 替换为 1,把 1 替换为 0
  • 在二进制反码上加1

位运算NOT~

~的处理过程

  • 把运算数转换成32位数字
  • 把二进制数转换成它的二进制反码
  • 把二进制数转换成浮点数

实质上是对数字求负,然后减1-num - 1

位运算AND & 和 OR | 和 XOR ^

  • &每个数字中的数位对齐,位对位进行与运算
  • |每个数字中的数位对齐,位对位进行或运算
  • ^每个数字中的数位对齐,位对位进行异或运算
  • JS中的二进制有32位,所以要进行32次运算

有符号移动<<< 、>>>和无符号移动 <<、>>

  • 有符号移动在移动的时候不会移动符号位,即不会移动第32位,而无符号移动会移动符号位
  • 左移<<相等于乘于2,而右移>>相当于除于2

遍历二进制位结构

由于二进制的结构是| 16 | 8 | 4 | 2 | 1 |这种结构,位数是从右边开始的,我们遍历要从右边开始

function eachBit(num, callback) {
while (num) {
num >>= 1
}
}
  • 这里使用了右移的方式遍历,当num为0的时候就停止遍历如10 = (0,1,0,1,0),最靠近左边的1在第四位2^4-1 = 8| 8 |,所以遍历了4次
  • 我们要把遍历的次数当前的位数以及被右移出去的值(0或1)传递给callback
function eachBit(num, callback) {
let i = 0
let bitNum = 0
while (num) {
// 奇偶位或第一位的值,也即即将被右移出去的值
const value = num % 2 // 位数 = 2^i
bitNum = Math.pow(2, i) callback && callback(value, i, bitNum) // 右移1位
num >>= 1
i++
}
}

使用遍历体实现字符串repeat函数

function repeat(str, n) {
let res = ''
eachBit(n, v => {
if (v === 1) {
res += str
}
if (n > 1) {
str += str
}
})
return res
}
  • 实现思路:由于字符串要重复的内容是一样的,为了减少遍历次数,采用了eachBit,比如n = 10那么二进制'1010'只需遍历四次
  • 注意上面的1对应的数字,第四位1对应| 8 |,第二位1对应| 2 |
  • str += str就是一直迭代,重复次数是2^n(n是遍历的次数)
  • v === 1的时候也即| 2 |,这时候是str + str2个重复的str| 8 |是8个重复的str
  • 也即str的重复次数是对应| 2 || 8 |的,刚好重复10次
  • n > 1是n等于1,没有必要再执行迭代了,只会遍历一次,且v必等于1,后面没有必要执行了

JS位运算和遍历的更多相关文章

  1. js位运算-按位非

    正数 取得二进制表示 取反(发现符号位是1,表示负数) 符号位不变,其余位取反 取反后加一 负数 取得负数的二进制表示(即绝对值的二进制反码加一) 取反即可

  2. js中的位运算

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

  3. js中位运算的运用

    原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...

  4. 深入研究js中的位运算及用法

    什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序 ...

  5. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  6. js赋值运算的理解

    简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...

  7. 【位运算经典应用】 N皇后问题

    说到位运算的经典应用,不得不说N皇后问题. 学过程序设计的都知道N皇后问题,没听过也没关系.很简单,最传统的的N皇后问题是这个样子的,给你一个n * n大小的board,让你放n个皇后(国际象棋),要 ...

  8. javascript的变态位运算

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

  9. Gym 100818I Olympic Parade(位运算)

    Olympic Parade http://acm.hust.edu.cn/vjudge/contest/view.action?cid=101594#problem/I [题意]: 给出N个数,找出 ...

随机推荐

  1. 手写的select 下拉菜单

    我们在进行表单设计时,可能要用到select下拉选项控件,遗憾的是,IE浏览器默认的select控件外观非常丑陋,而且不能用样式来控制,不能在选项中添加图片等信息.今天我将通过实例来讲解如何用CSS和 ...

  2. angular中使用canvas画布做验证码

    //填充画布,五位随机数 drawNumber(): void { this.clearCanvas(); let ctx: CanvasRenderingContext2D = this.myGra ...

  3. Python 起步 多版本共存配置

    上次我选择的是py2.x,如果我要再装一个py3.x呢 我们去设置环境变量,然后去命令行输入python,这里我故意把环境变量放在第一行,貌似换成3.7了 我们把2.7的放在3.7的前面呢?又换回去了 ...

  4. 分布式锁-session-事务相关

    1. 分布式锁--zookeeper 1). client调用create()方法创建"/root/lock_"节点,注意节点类型是EPHEMERAL_SEQUENTIAL. 2) ...

  5. JS展示预览PDF。

    刚好遇到需求,需要在手机端--展示一个电子收据,电子收据返回是PDF格式的,所以需要在前端上面去做PDF预览. 在学习过程中,了解到一种很简单,不需要任何插件的方法做PDF预览,但是这方法有局限性. ...

  6. JS语法字典---网友总结

    1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏 ...

  7. C 碎片四 流程控制

    前面介绍了程序中用到的一些基本要素(常量,变量,运算符,表达式),他们是构成程序的基本成分,下面将介绍C语言中流程控制的三种结构:顺序结构.分支结构.循环结构 一.顺序结构 顺序结构的程序设计是最简单 ...

  8. hibernate课程 初探单表映射2-1 hibernate进阶 本章简介

    本章简介,主要讲5大块的内容 1 hibernate.cfg.xml的配置 2 session 的简介 3 transaction的简介 4 session的详解 5 对象关系映射常用配置

  9. java如何导入Excel文件

    Java使用POI导入Excel文件,操作起来比较简单,支持xlsx格式. 下载POI资源包 从官网https://poi.apache.org/下载POI,笔者选择的是版本是3.17,下载后文件名是 ...

  10. Django之model基础(查询补充)

    学习完简单的单表查询外,是远远不够的,今天我们对查询表记录做一个补充,接下来来看看基于对象的跨表查询.基于双下划线的跨表查询,聚合查询和分组查询,F查询与Q查询. 比如我们有如下一张表,在model中 ...