JavaScript位运算的妙用

news2024/12/23 15:51:42

位运算的妙用: 奇偶数, 色值换算,换值, 编码等

位运算的基础知识:

  1. 操作数是32位整数
  2. 自动转化为整数
  3. 在二进制下进行运算

一.按位与&

判断奇偶数:

  1. 奇数: num & 1 == 1
  2. 偶数: num & 1 == 0

基本知识:

  1. 用法:操作数1 & 操作数2
  2. 规则:有 0 则为 0,双 1 则为 1
  3. 原理:先将操作数1操作数2转为二进制数,按照第2步进行计算
 

二.按位或|

按位或|取整

  1. num | 0

        eg: 5.23 | 0 => 5.23 | 0的结果是5

按位或|

  1. 自身|自身=自身,可以比较数值相等(仅限于整数)

三.按位非~

按位非远算符(~),反转操作数的位. 表象是对数字为负, 然后减去1(-x-1)

        eg: ~9 = -9 -1 = -10

按位非~: 判断数组中是否包含某个元素

  1. 不存在, indexOf返回-1
  2. ~-1 = -(-1)-1=1-1=0
  3. ~arr.indexOf(val) => 数组中不存在val这个值

按位非~取整

  1. ~~x 

        eg: ~~5.5677878 // 5

四.按位异或^

按位异或^ 归零律,恒等律,自反,集合律

  1. 归零律: a^a=0; 自己异或自己,位数上的值肯定相同
  2. 恒等律:a^0=a; 自己异或自己, 自己是啥结果是啥
  3. 自反: a^a^a=0^a = a; a三次^等于它自己
  4. 集合律: a^b^c == c^b^a, 与顺序无关

按位异或^ 值交换

  1. 变量值为数字,完成值的交换(不用增加临时变量)

示例: 

let a = 10
let b = 20
a^=b //=> a = b^a => a^b
b^=a //=> b = a^b => (a^b) ^b => a ^ (b^b) =>  a ^ 0 =>  a => 结果是b=a
a^=b //=> a = b^a => b^b^b ^ (a^a) => b ^ 0 => b =>结果是: a = b
console.log('a:', a) // 20
console.log('b:', b) // 10

五.左移运算符:<<

<< 运算符执行左移位运算。

在移位运算过程中,符号位始终保持不变。

如果右侧空出位置,则自动填充为 0;

超出 32 位的值,则自动丢弃

console.log(5 << 2); // 20

基本知识:

  1. 用法:操作数1 << 左移位数
  2. 规则:符号位不变,按位左移,右边补0
  3. 原理:先把操作数1转换为二进制数

六.右移运算符:>>

>> 运算符执行有符号右移位运算。

与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。

移动过程中超出的值将被丢弃。

console.log(1000 >> 8); // 3

基本知识:

  1. 用法:操作数1 >> 右移位数
  2. 规则:符号位不变,按位右移,左边补0
  3. 原理:先把操作数1转换为二进制数


七.以下是JavaScript提供的二进制和十进制互转方法:

二进制转十进制方法: parseInt

parseInt(string, radix) 

eg: console.log(parseInt(1010,2)); // 10

十进制转二进制: 字符串.toString(2)

同理: 十进制转16进制是: 字符串.toString(16)

eg: 

const number = 10
console.log(number.toString(2)); // 1010

运用场景:

rgb和16进制颜色相互转换:

function colorRGBToHex(rgb) {
    // split的参数可以是正则
    const rgbArr= rgb.split(/[^\d]+/)
    // ['',  '数字1', '数字2', '数字3', '']
    const color = rgbArr[1] << 16 | rgbArr[2] << 8 | rgbArr[3];
    return `#${color.toString(16)}`
}
console.log(colorRGBToHex('rgb(204, 0, 255)'))

// 16进制转rgb格式
function colorHexToRGB(hex) {
    // 转为6位的16进制, 0x??????
    let newHex = hex.replace('#', '0x'),
    r = newHex >> 16,
    g = newHex >> 8 & 0xff,
    b = newHex & 0xff
    return `rgb(${r},${g},${b})`
}
console.log(colorHexToRGB('#CC00FF'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WhaleStudio 分钟级构建 AI 模型,强大 Ops 能力简化模型调度与部署

什么是机器学习(ML)? 它有什么作用 机器学习(ML)是人工智能(AI)的一个子集&#xff0c;通过算法发现数据中的通用模式&#xff0c;并根据持续不断的训练来优化调整最终结果。ML模型从过去的经验中学习&#xff0c;并根据已有的经验进行预测。例如&#xff0c;现在的电商已不再…

外贸人如何一眼识别骗子

最近收到很多客户在平台上直接发过来一些压缩包&#xff0c;然后说自己是和某个国家的政府签订的合作方案&#xff0c;请查看这些压缩包里的图纸和附件是否能够提供&#xff0c;麻烦核算价格等等。 当我看到客户发过来这些东西的时候&#xff0c;第一反应不是打开附件或者是来…

React中为啥key不可以使用索引值index?(超详细版本)

索引值index与唯一标识符id区别 1、索引值index是表示列表中每个元素的位置&#xff1b; 特点&#xff1a;从0开始&#xff0c;在列表变化时react重新分配索引值&#xff0c;造成索引值与元素标签的对应关系不是稳定的一一对应。 const list ["apple", "bana…

掌握Vim编辑器,轻松提升编程效率

1. 什么是VIM Vim (Vi improved)是从 Vi 发展出来的一个文本编辑器&#xff0c;简单的来说&#xff0c;Vi 是老式的文本处理器&#xff0c;功能已经很齐全了&#xff0c;但还是有可以进步的地方。 之后&#xff0c;Vim 之父 Bram Moolenaar 在 Vi 的源代码基础上进行了修改&a…

链式二叉树(二叉树看这一篇就够了)

顾名思义就是使用链式存储来实现的二叉树,因为二叉树是递归定义的,所以二叉树的实现中,都是会使用递归来完成.这里面需要一些前置的二叉树理论知识,对这部分不是很理解的可以先看下这篇二叉树的概念. 下面开始进入正题了: 1.二叉树的创建 假定现有"ABD##E#H##CF##G##&quo…

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…

[Linux]多线程编程

[Linux]多线程编程 文章目录 [Linux]多线程编程pthread_create函数pthread_join函数pthread_exit函数pthread_cancel函数pthread_self函数pthread_detach函数理解线程库和线程id Linux操作系统下&#xff0c;并没有真正意义上的线程&#xff0c;而是由进程中的轻量级进程&#…

vue3 踩坑记(汇总)

1、在 vue3 中&#xff0c;GET 请求接口时&#xff0c;传入一个数组&#xff0c;默认是以“xxx[]: 1, 2, 3”的形式传递的&#xff0c;报错&#xff1a;“400 Bad Request” 解决方案&#xff1a; 传参时&#xff0c;需要将数组字符串化&#xff0c;比如&#xff1a;ids: sele…

二维码智慧门牌管理系统:提升社会治理效率的利器

文章目录 前言一、技术背景与特点二、数据准确性和一致性三、综合服务平台四、应用领域 前言 在当今科技不断发展的时代&#xff0c;我们的生活正逐渐数字化和智能化。近期&#xff0c;一种名为“二维码智慧门牌管理系统”的新型技术引起广泛关注。这一系统的出现不仅为我们的…

软件测试之银行测试,银行测试YYDS

为什么要做金融类软件测试 举个例子&#xff0c;比如银行的软件测试工程师&#xff0c;横向和互联网公司的测试人员比较来说&#xff0c;工资比较稳定&#xff0c;加班很少甚至没有&#xff0c;业务稳定。 实在是测试类岗位中的香饽饽&#xff01; 同时&#xff0c;我也准备了…

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图&#xff0c;不知道你有没有想过尝试制作里面的国界&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 制作已定国界 在地图数据内&#xff0c;国界分为已定国界、未定国界和海岸线&#xff0c;我们先对已定…

一文详解:什么是进销存管理系统?2023年top10进销存管理系统大推荐!

进销存管理系统是什么&#xff1f;进销存管理系统的优势在哪里&#xff1f;进销存管理系统都能为企业提供什么&#xff1f;有哪些便宜适合的进销存管理系统&#xff1f;本文将带大家深入浅出的聊聊进销存管理系统&#xff0c;并且为大家提供2023年十大进销存管理系统大盘点&…

企业简化客户服务的5种方法

在现代商业中&#xff0c;提供优质客户服务是企业能否成功的关键所在。为了满足客户的需求&#xff0c;企业需要保证客户服务的质量和效率。而许多公司却发现&#xff0c;随着公司的发展&#xff0c;客户服务的过程变得越来越复杂。许多企业陷入了自己制造的困境&#xff0c;面…

简易磁盘自动监控服务

本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况&#xff0c;一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息&#xff0c;需要邮件接收客户都安开启SMTP服务。简要流程请参考下…

燃尽图是什么?如何用它提升敏捷项目流程?

**敏捷项目管理**的核心是透明度和持续改进。燃尽图是轻松实现这两点的秘密武器。这种动态的可视化工具能有效地说明团队在一段时间内的进展情况&#xff0c;突出显示剩余的工作&#xff0c;并揭示你的团队是否在实现目标的正轨上。 敏捷项目管理中的燃尽图 燃尽图是敏捷项目…

【git入门教程--基于gitee】

1.git 下载安装 首先下载windows版本的git安装包 https://git-scm.com/download/win 我这里选择64位 windows版本&#xff0c;大部分人用的也是这个版本。安装过程很简单&#xff0c;基本都是下一步再下一步。 2.用户配置 git安装完成之后&#xff0c;在电脑文件夹的任意位…

python程序主动退出进程的方式:五种方式总有一种适合你

一、使用os.kill() os.kill()是一种向进程发送信号的方法&#xff0c;可以用来强制结束一个进程的运行。如果你的程序中包含有线程&#xff0c;用这种方式绝对没错&#xff01;当使用os.kill()方法结束一个进程时&#xff0c;需要指定该进程的PID&#xff08;进程号&#xff0…

【办公自动化】用Python将PDF文件转存为图片(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Java SE】反射与枚举

目录 ♫反射 ♪什么是反射 ♪与反射相关的类 ♪什么是Class类 ♪获取Class类 ♪class类的常用方法 ♪反射的使用 ♪反射私有方法 ♪反射的优缺点 ♫枚举 ♪什么是枚举 ♪枚举的常用方法 ♪枚举的构造方法 ♫枚举与反射 ♫反射 ♪什么是反射 Java反射是Java语言的一…

【VUE复习·1】单向数据绑定v-bind;双向数据绑定v-model

总览 1.单向数据绑定&#xff1a;v-bind 2.双向数据绑定&#xff1a;v-model 一、v-bind 单向数据绑定 1.图解 data 中的值能够影响页面上的值&#xff0c;但是在页面上更改却不能影响 data 中的值。 2.用法说明 <div><input v-bind:value"name">&l…