JS中的位操作在实际项目中的应用
前言:
Linux中的文件管理子系统的权限管理,想必大家都知道:rwx分别代表read(可读),write(可写), execute(可执行,如果是可执行程序的话),其中rxw可以按照数字表示:
r ------------- 4
w ------------- 2
x ------------- 1
如果有可读,可写,可执行权限,则用7表示...
在最近的项目中,就遇到了这样的问题:我们做是IOT的硬件报警设备,现在一共有7种报警类型,每种设备报警的可能有:1种,多种或者0种,后台返回一个10进制数字来表示这种可能,前端需要根据后台返回的数字判断包含的报警。
其实这个就跟linux文件权限一样,后台用bit位来存储设备报警结果,一共有7种报警类型,8个bit位就够了,每一个bit位对应一种报警类型,如果包含某种报警,对应的位置为1,反之置为0,然后后台将bit转位10进制的数字传给前端。其实表示这7种报警类型常规的做法是:后台为这报警类型alarm字典,将这7种报警类型存入alarm字典中,每一种报警类型是否包含的话用true和false处理,返回给前端的话如下:
{
alarm1: true,
alarm2: false,
alarm3: true,
alarm4: false,
alarm5: true,
alarm6: false,
alarm7: true,
}
从结果中,前端可以判定设备产生了4中报警:alarm1,alarm3,alarm5,alarm7。。。
回到我现在的问题中去,前端需要将后台返回的10进制数字转为2进制数字(8个bit位),然后去判断1的位置,如果某一位的值为1,则包含对应的报警.
方法一:非CS专业出身笨办法
let type = alarm.toString(2).padStart(8, '0').split('').reverse()
const arr = [] // 用来存储包含的报警类型
for (var i = 0; i < type.length; i++) {
if (type[b] === '1') {
switch (i) {
case 0:
alarm.push[i]
break
case 1:
alarm.push[i]
break
case 2:
alarm.push[i]
break
case 3:
alarm.push[i]
break
case 4:
alarm.push[i]
break
case 5:
alarm.push[i]
break
default:
break
}
}
}
console.log(arr.toString()) // 打印出所有的报警类型
方法二:利用位操作判断(对于js按位操作不熟悉的同学,请自行补充相关知识)
const arr = [] // 用来存储包含的报警类型
for (let i = 0; i < 7; i++) {
if (alarm >> i & 1) {
arr.push(i)
}
}
console.log(arr.toString()) // 打印出所有的报警类型
按照这个实现,虽然看着舒服,但是简洁加执行效率高,还是很帅的。
最后来说下,我google的实现结果,感觉更好理解:
// 预先定义不同报警类型
const alarm1 = 1; // 0000 0001
const alarm2 = 1 << 1; // 0000 0010
const alarm3 = 1 << 2; // 0000 0100
const alarm4 = 1 << 3; // 0000 1000
const alarm5 = 1 << 4; // 0001 0000
const alarm6 = 1 << 5; // 0010 0000
const alarm7 = 1 << 6; // 0100 0000 const arr = [] // 用来存储包含的报警类型
const alarm = 7; // 后台返回的10进制数字 // 是否包含alarm1
if (alarm & alarm1) {} // 是否包含alarm1和alarm2中的任意一个
if (alarm & (alarm1 | alarm2)) {} // 是否只包含alarm1和alarm2
if (alarm === (alarm1 | alarm2)) {} // 是否同时包含alarm1和alarm2
if (alarm === (alarm | (alarm1 | alarm2)) ) {}
参考资料:
https://codeburst.io/using-javascript-bitwise-operators-in-real-life-f551a731ff5
JS中的位操作在实际项目中的应用的更多相关文章
- 项目中使用express,只是单纯项目中使用
安装express npm install express --save-dv 建议安装到dev依赖里面 安装body-parse npm install body-parser --save-dev ...
- iOS中AOP与Method Swizzling 项目中的应用
引子:项目中需要对按钮点击事件进行统计分析,现在项目中就是在按钮的响应代码中添加点击事件,非常繁琐.所以使用了AOP(面向切面编程),将统计的业务逻辑统一抽离出来. 项目中添加的开源库:https:/ ...
- Eclipse中定位当前文件在项目中的位置
点击红色框内的按钮,就能定位当前文件在项目中的位置, 另外, 找到位置后记得再点击一下这个按钮, 要不然每次打开一个文件都会自动定位
- idel 中 生成 jar包 和项目中自己需要的包
一.首先在自己的项目中创建一个类类中创建一个构造方法构造方法中传入一个字符串参数(这个字符串参数是为了传入路径) 在方法体内通过file类创建文件夹(换而言之就是项目中的包) 二 .就是对这个项目中的 ...
- JQuery复制内容到剪切板-jquery.zclip.js的使用,在公司项目中
公司项目中有一个复制粘贴的内容,也试图找其他插件但都是浏览器兼容问题,在网上找这个插件挺不错的,FLASH,兼容各个浏览器,测试时要在服务器环境下,点击参考,参考这个网址,或者搜下标题这个插件,性能不 ...
- 将Ext JS 5应用程序导入Web项目中
相关资料:http://docs.sencha.com/extjs/5.1/getting_started/welcome_to_extjs.html 原文地址: https://blog.csdn. ...
- Eclipse中使用maven构建web项目中遇到的问题
构建过程参考: http://blog.csdn.net/smilevt/article/details/8215558/ http://www.cnblogs.com/dcba1112/archiv ...
- 理解css中Grid布局,在项目中如何实现grid页面布局
简介 CSS中Grid是一种二维网格式布局方式.我们常规使用table.float.position.inline-block等布局,但它们遗漏了很多功能,例如垂直居中.后来css3中flexbox的 ...
- 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略
<!--尾部开始--> <iframe src="http://172.16.24.11:9000/cartoon-web/footer_new" m ...
随机推荐
- Linux-进程管理
关于进程 Process what is process ? 什么是进程 process life cycle 进程的生命周期 process states 进程状态 什么是进程? 进程是已启动的可执 ...
- python第九天
复习内容: 文件处理 1. 操作文件的三步骤: ---打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持有 ---操作文件:读写操作 ---释放文件:释放操作系统对硬盘空间的持有 2. ...
- webstorm开发微信小程序
参考博客:https://www.cnblogs.com/pansidong/articles/7563155.html
- 【关于Java移位操作符&按位操作符】
一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...
- Python菜鸟快乐游戏编程_pygame(3)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- quartz基本介绍和使用
一.什么是quartz,有什么用. Quartz是一个完全由java编写的开源作业调度框架,由OpenSymphony组织开源出来.所谓作业调度其实就是按照程序的设定,某一时刻或者时间间隔去执行某个代 ...
- CDN-常用静态资源公共库
js.css 等静态资源可以放在自己的服务器上,或者引用网络上的公共库使用(CDN) CDN 读取失败时从本地加载 <script src="https://code.jquery.c ...
- 使用Docker安装ELK系列(超简单)
root权限 docker版本:1.13.1 ELK版本:6.4.3 项目中均关闭X-Pack 一.安装Elasticsearch 新建elasticsearch目录,并再其下新建文件config/e ...
- D3 learning notes
D3 https://d3js.org/ 数据驱动文档显示, 利用 SVG HTML CSS技术. D3.js is a JavaScript library for manipulating doc ...
- 乙方渗透测试之Fuzz爆破
前言 爆破在渗透测试中,对技术的要求不高,但是对技巧和字典的要求就很高了,本篇整理下平时学到的一些爆破思路和技巧(偏web渗透登陆),当你无措可施时,暴力破解是最好的方式. 世界上最可怕的事情是你的习 ...