前端位运算运用场景小知识(权限相关)

前提:此篇结合AI、公司实际业务产出,背景是公司有个业务涉及权限,用位运算来控制的,比较新奇,所以记录一下(可能自己比较low)

前端js位运算一般实际的应用场景在哪

ai回答:

  1. 整数运算与性能优化:
  • 位运算直接对整数的二进制位进行操作,因此在处理大量整数运算时,相较于常规算术运算,位运算通常具有更高的性能。
  • 在一些需要快速计算整数的场景中,如游戏开发、加密解密等,位运算尤为有用。
  1. 权限与状态管理:
  • 位运算常用于权限与状态的管理。例如,可以使用位掩码(bitmask)来设置、检查和修改一系列独立的标志位,每个标志位代表一个特定的权限或状态。
  • 按位与(&)、按位或(|)和按位异或(^)等运算符在处理此类场景时特别有用。
  1. 图像处理与图形学:
  • 位运算在图像处理与图形学中也有广泛应用,因为颜色和像素数据通常可以用二进制位来表示。
  • 例如,可以使用位运算来组合、修改或比较像素的颜色值,实现各种图像效果。
  1. 数据加密与校验:
  • 位运算在数据加密和校验中扮演着重要角色。
  • 例如,可以使用按位异或(^)运算符来加密或解密数据,因为异或操作具有可逆性。
  • 校验和(checksum)的计算也经常使用位运算来确保数据的完整性和准确性。
  1. 快速判断与转换:
  • 位运算可以用于快速判断一个数的性质,如奇偶性、符号等。
  • 通过位运算,还可以将一个整数快速转换为其他格式的数据,如布尔数组。
  1. 网络编程与底层通信:
  • 在网络编程和底层通信中,位运算常用于编解码和协议解析等任务。
  • 例如,可以使用位运算来解析数据包的头部信息,或者将数据按照特定的位格式进行编码和解码。
  1. 浮点数向下取整:
  • 在处理浮点数时,有时需要将其向下取整为最接近的整数。虽然JavaScript提供了Math.floor()函数来实现这一功能,但位运算也可以作为一种快速替代方案(例如,使用num | 0)。

关于权限与状态管理

  • 公司业务涉及权限业务,以往认知只知道几种控制权限的实现方案:例如 动态路由、自定义指令、用户权限、菜单|按钮权限、接口权限等等,但这个用位运算来控制权限的比较有趣

什么是位运算?

  • 位运算(Bit Manipulation)是直接在整数的二进制位上进行的操作,相当于转成二机制数进行运算

按位与(&)

按位与操作符会将两个数的二进制表示进行逐位比较,当且仅当两个相应的二进制位都为1时,结果位才为1,否则为0。

示例:

  A: 1010 (十进制中的 10)
& B: 1100 (十进制中的 12)
----------
结果: 1000 (十进制中的 8)

按位或(|)

按位或操作符会将两个数的二进制表示进行逐位比较,只要两个二进制位中有一个为1时,结果位就为1。

示例:

  A: 1010 (十进制中的 10)
| B: 1100 (十进制中的 12)
----------
结果: 1110 (十进制中的 14)

按位异或(^)

按位异或操作符会将两个数的二进制表示进行逐位比较,当两个相应的二进制位相异时,结果位为1,否则为0。

示例:

  A: 1010 (十进制中的 10)
^ B: 1100 (十进制中的 12)
----------
结果: 0110 (十进制中的 6)

左移(<<)

左移操作符会将数的所有位向左移动指定的位数。右侧空出的位用0填充,左侧溢出(超出位数限制)的位则丢弃。

示例:

将数字 4 (二进制中的 0100) 左移 1 位:A: 0100 (十进制中的 4)
<< 1
----------
结果: 1000 (十进制中的 8)

位取反(~)

位取反操作符会对数字的二进制表示中的每一位执行取反操作(0变为1,1变为0)。注意,由于位取反是对整个数字进行操作(通常是32位或64位,取决于JavaScript的实现),所以结果可能是负数,因为最高位(符号位)也可能被取反。

示例(以8位为例,但JavaScript中的位运算通常是32位):

  A: 0100 (十进制中的 4,假设只有4位)
~
----------
结果: 1011 (十进制中的 -5,如果是8位二进制,最高位是符号位)

在JavaScript中,因为数字是以补码形式表示的,所以位取反后得到的是一个负数。在上面的例子中,如果假设是4位的二进制数(仅用于演示),那么0100(即4)会得到1011,这在4位二进制中不是一个有效的正数值,但如果看作是有符号的8位二进制数(最高位为符号位),则1011表示的是-5(因为它是正数5的补码的反码加1)。

权限业务实际怎么使用

假设我们有一个用户系统,每个用户可以有多个权限,如读取(READ)、写入(WRITE)、删除(DELETE)和执行(EXECUTE)等。我们可以使用位运算为每个权限分配一个唯一的位,并将这些位组合起来存储在一个整数中。

权限定义

const PERMISSIONS = {READ: 1 << 0,  // 1 (二进制: 0001)WRITE: 1 << 1, // 2 (二进制: 0010)DELETE: 1 << 2, // 4 (二进制: 0100)EXECUTE: 1 << 3 // 8 (二进制: 1000)
};

这里使用左移操作符(<<)来为每个权限分配一个唯一的位。例如,READ 权限被分配了最低位(即 2 的 0 次方,即 1),WRITE 权限是 2 的 1 次方(即 2),以此类推。

用户权限

假设我们有一个用户,该用户具有 READEXECUTE 权限:

let userPermissions = PERMISSIONS.READ | PERMISSIONS.EXECUTE; // 9 (二进制: 1001)

这里使用按位或操作符(|)来组合 READ 和 EXECUTE 权限。

检查权限

现在我们可以使用按位与操作符(&)来检查用户是否具有某个权限:

function checkPermission(userPermissions, permissionToCheck) {return (userPermissions & permissionToCheck) === permissionToCheck;
}console.log(checkPermission(userPermissions, PERMISSIONS.READ)); // true
console.log(checkPermission(userPermissions, PERMISSIONS.WRITE)); // false
console.log(checkPermission(userPermissions, PERMISSIONS.EXECUTE)); // true

在这个 checkPermission 函数中,我们通过将 userPermissions 和要检查的 permissionToCheck 进行按位与操作,并检查结果是否等于 permissionToCheck 来判断用户是否具有该权限。如果结果等于 permissionToCheck,则说明该位被设置(即用户具有该权限),否则说明该位未被设置(即用户不具有该权限)。

添加或删除权限

我们还可以使用按位或和按位异或操作符来添加或删除用户的权限:

// 添加 WRITE 权限
userPermissions |= PERMISSIONS.WRITE; // 11 (二进制: 1011)// 删除 READ 权限
userPermissions &= ~PERMISSIONS.READ; // 10 (二进制: 1010) 这里的 ~ 是位取反操作符

我们使用按位或操作符(|=)为 userPermissions 添加了 WRITE 权限,使用按位异或操作符(&= ~)删除了 READ 权限。注意,在删除权限时,我们使用了位取反操作符(~)来创建一个只有 READ 位被设置为 0 的掩码,然后将该掩码与 userPermissions 进行按位与操作,从而清除 READ 位。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度&#xff08;像素变换&#xff09; 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法&#xff0c;请参阅本专栏的其…

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 加入课程 我们先看下加入课程 1.是否登录 2.课程是否存在 3.是否已经存在 4.添加 首先实现逻辑 def get_student_course(db: Session, course: int…

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…

【9.PIE-Engine案例——加载Terra星全球500m植被指数16天合成产品(MOD13A1 V61)数据集】

加载Terra星全球500m植被指数16天合成产品(MOD13A1 V61)数据集 原始路径 欢迎大家登录航天宏图官网查看本案例原始来源 最终结果 具体代码 /*** File : MOD13A1* Time : 2020/7/21* Author : piesat* Version : 1.0* Contact : 400-890-0662* License : …

Interesting bug caused by getattr

题意&#xff1a;由 getattr 引起的有趣的 bug 问题背景&#xff1a; I try to train 8 CNN models with the same structures simultaneously. After training a model on a batch, I need to synchronize the weights of the feature extraction layers in other 7 models. …

WARNING: Ignoring invalid distribution -ip警告信息如何去掉?

查看已安装依赖列表的时候&#xff0c;出现了很多警告信息&#xff0c;如何去掉呢&#xff1f; 解决办法 打开这个路径&#xff1a;d:\software\python\python39\lib\site-packages 这种波浪线开头的&#xff0c;我们将它删除掉,就可以了。

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

VS2019报错:找不到导入的项目,请确认import声明

解决办法 找到项目的.vcxproj文件 用记事本打开后使用ctrlF搜索import 发现import Project后面的.props文件路径不对&#xff0c;将路径改为相对路径 保存后重新加载项目&#xff0c;即可生成成功

AI发展下的伦理挑战:构建未来科技的道德框架

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们正处在一个前所未有的科技变革时代。AI不仅在医疗、教育、金融、交通等领域展现出巨大的应用潜力&#xff0c;也在日常生活中扮演着越来越重要的角色。然而&#xff0c;这一技术的迅猛进步也带来…

git实践汇总【配置+日常使用+问题解决】

**最初配置步骤&#xff1a;** git config --global user.name "yournemae" git config --global user.email "yourmail" git config -l ssh-keygen -t rsa -C “xxx.xxxx.EXTcccc.com” git config --global ssh.variant ssh $ git clone git仓库路径 git…

云盘高速检测的秘密:密封圈外观检测全解析!

密封圈是一种用于填塞、隔离或密封两个相互连接部件之间空隙的圆形密封装置。密封圈通常由橡胶、塑料、金属等材料制成&#xff0c;具有弹性并能在压力作用下填充间隙&#xff0c;防止液体、气体或固体物质泄漏。 密封圈可根据具体应用选择不同材料&#xff0c;如橡胶密封圈适…

「Unity3D」场景中的距离单位Unit与相关设置PixelsToUnits、PixelsPerUnit

GameObject在场景的位置Position&#xff0c;并没有明确是什么具体单位——如&#xff1a;Transform的x、y、z&#xff0c;或RectTransform的PosX、PosY、PosZ。而RectTransform在面板上显示的Width和Height&#xff0c;也没有具体单位&#xff0c;其实并不是像素。 事实上&am…

谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码

文章目录 一&#xff0c; 使用逆向工程生成的代码二&#xff0c;生成品牌管理菜单三&#xff0c;几个小问题 在本次的技术实践中&#xff0c;我们利用逆向工程的方法成功地为后台管理系统增加了品牌管理功能。这种开发方式不仅能快速地构建起功能模块&#xff0c;还能在一定程度…

qemu上运行android-x86 (基于ubuntu)

安装qemu x86_64 下载qemu源代码 进入根目录&#xff0c;执行./configure --target-listx86_64-softmmu make -j4 sudo make install 期间可能遇到python相关问题&#xff0c;比如版本不对、库找不到&#xff0c;版本不对可自行安装或是修改环境变量&#xff0c;库找不到可以检…

如何检查代理IP地址是否被占用

使用代理IP时&#xff0c;有时候会发现IP仍然不可用&#xff0c;可能是因为已经被其他用户或者网络占用了。为了检测代理IP是否被占用&#xff0c;我们可以采用一些方法进行验证测试&#xff0c;以保证代理IP的有效性和稳定性。 1.ARP缓存方法 ARP缓存法是一种简单有效的检测代…

unity 实现图片的放大与缩小(根据鼠标位置拉伸放缩)

1创建UnityHelper.cs using UnityEngine.Events; using UnityEngine.EventSystems;public class UnityHelper {/// <summary>/// 简化向EventTrigger组件添加事件的操作。/// </summary>/// <param name"_eventTrigger">要添加事件监听的UI元素上…

将Android Library项目发布到JitPack仓库

将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下&#xff0c;初始分支称为 main; 如果使用 Git 2.28.0 或更高版本&#xff0c;则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本&#xff0c;则可以使用 git symbo…

ffmpeg更改视频的帧率

note 视频帧率调整 帧率(fps-frame per second) 例如&#xff1a;原来帧率为30&#xff0c;调整后为1 现象&#xff1a;原来是每秒有30张图像&#xff0c;调整后每秒1张图像&#xff0c;看着图像很慢 实现&#xff1a;在每秒的时间区间里&#xff0c;取一张图像…

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…