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 ...
随机推荐
- makefile 转载
http://blog.csdn.net/hongfuhaocomon/article/details/51523394 http://blog.csdn.net/lanmanck/article/d ...
- JS“盒子模型”
列举几个常用的属性 client系列 clientWidth - 盒子真实内容的宽度[content+padding左右],不包括边线和滚动条 clientHeight - 盒子真实内容的高度[con ...
- 散列(C++实现)
散列的构成:散列函数,散列表的存储方式,散列表的冲突解决方法. 1.散列函数 较常用的散列函数有除留余数法,数字分析法,平方取中法,折叠法. 2.散列表的存储方式 闭散列法(开地址法),用数组存储:开 ...
- asp.net webapi 获取报文体的问题
用这种方法: var data=await Request.Content.ReadAsStringAsync(); 一般都无法获取到内容.原因是内部的流对象已经到了最后面.要获取到里面的需要把流的位 ...
- ubuntu 装机必备
在github上下载高博的slambook(https://github.com/gaoxiang12/slambook)在3rdparty文件夹中有安装包. 1. 安装Eigen库 sudo apt ...
- [经验交流] 试用 grafana 报警功能
1. grafana 概述 grafana 是一款优秀的数据展示工具,几乎是各类时序数据库的前端标配系统.grafana 在V4版本中已经加入了报警功能. 2. influxdb 概述 influxd ...
- 学习笔记——单片机简介 & 点亮LED & 流水灯 & 电路基础【更新Ing】
视频地址:https://www.bilibili.com/video/av10765766 超详细!!!!!! 单片机内部三大资源 [资源:单片机可提供使用的东西] FLASH 可以重复擦写 断电后 ...
- eclpse:安装explorer或eExplorer插件
结论:个人感觉 eExplorer更好. 1.安装explorer Help->Eclipse Marketpalce find:explorer dian 点击"Install&qu ...
- ubuntu 配置apt-get源
ubantu安装软件速度慢一般是因为系统默认选择的源导致,可以通过手动配置源设置解决. 1. 原文件备份 sudo mv /etc/apt/sources.list /etc/apt/sources. ...
- Union 与 Union all 的区别【坑】
UNION操作符用于合并两个或多个SELECT语句的结果集 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必 ...