JS位运算和遍历
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 + str
2个重复的str
,| 8 |
是8个重复的str
- 也即
str
的重复次数是对应| 2 |
和| 8 |
的,刚好重复10次 n > 1
是n等于1,没有必要再执行迭代了,只会遍历一次,且v必等于1,后面没有必要执行了
JS位运算和遍历的更多相关文章
- js位运算-按位非
正数 取得二进制表示 取反(发现符号位是1,表示负数) 符号位不变,其余位取反 取反后加一 负数 取得负数的二进制表示(即绝对值的二进制反码加一) 取反即可
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
- js中位运算的运用
原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...
- 深入研究js中的位运算及用法
什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序 ...
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
- js赋值运算的理解
简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...
- 【位运算经典应用】 N皇后问题
说到位运算的经典应用,不得不说N皇后问题. 学过程序设计的都知道N皇后问题,没听过也没关系.很简单,最传统的的N皇后问题是这个样子的,给你一个n * n大小的board,让你放n个皇后(国际象棋),要 ...
- javascript的变态位运算
javascript的变态位运算 var a = "10" | 0; alert(a); alert (typeof a);结果为10,number. 这就是说这条语句可以将字符串 ...
- Gym 100818I Olympic Parade(位运算)
Olympic Parade http://acm.hust.edu.cn/vjudge/contest/view.action?cid=101594#problem/I [题意]: 给出N个数,找出 ...
随机推荐
- JMETER断言:终极指南
你想要: 检查服务器响应是否包含特定字符串, 或验证服务器返回了HTTP 200 OK, 或者检查json字段的值(使用类似JsonPath$.store..price). 断言是要走的路. 问题是: ...
- 阿里云服务器 linux 怎么安装php(PHPSTUDY)开发环境
1.首先登录行云管家(https://yun.cloudbility.com/login.html) wget -c http://lamp.phpstudy.NET/phpstudy.bin //下 ...
- 注意sqlite3和java的整数数据类型的区别
作为新手的我,没有考虑数据库和java的数据类型的对应上的区别: sqlite3的数据类型和java数据类型对应上要小心,特别是整数类型. java 中int类型4位存储,范围 -2^31到2^31- ...
- python3——“->”的含义
->:标记返回函数注释,信息作为.__annotations__属性提供,__annotations__属性是字典.键return是用于在箭头后检索值的键.但是在Python中3.5,PEP 4 ...
- gogs迁移
windows->linux 之前gogs放在windows server2016中,需要迁移至linux docker中. 首先拉取gogs镜像 docker pull gogs/gogs 然 ...
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- C# 枚举与switch用法
using System; namespace Csharp { class Program { //枚举 public enum TimeOfDay { Morning=, Afternoon=, ...
- sourceInsight4 破解笔记(完美破解)
https://www.cnblogs.com/Napoleon-Wang/p/6706773.html 时隔好多年,sourceinsight4以迅雷不及掩耳之势的来了.与3.5相比,sourcei ...
- python3+Appium自动化05-xpath定位
概念 xpath定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执行效率比较低(特别是元素路径比较深的时候),一般使用比较少.通常使用xpath相对路径和属性 ...
- JDBC让java程序连上数据库(mysql数据库)
一.小论异常: 其实JDK已经提供了一组API让java程序连上数据库,并执行SQL语句,其实说起来也蛮简单的,但是绝对是一个细致活,因为稍不留神,异常就铺天盖地的来了,下面说说这些异常吧(声明一下: ...