java 位运算 权限控制_JavaScript 中的位运算和权限设计

本文介绍了如何使用Java的位运算来设计权限控制系统,通过位运算的按位与、按位或和按位异或等操作,实现了权限的赋予、校验和删除。同时,针对位运算的局限性,提出了权限空间的概念,通过权限空间来突破位数限制,实现更灵活的权限管理。最后,讨论了其他替代方案,如使用字符串或质数表示权限。
摘要由CSDN通过智能技术生成

原标题:JavaScript 中的位运算和权限设计

作者:云音乐前端团队

https://musicfe.dev/java-bitwise-operators/

1. 内容概要

本文主要讨论以下两个问题:

Java 的位运算:先简单回顾下位运算,平时用的少,相信不少人和我一样忘的差不多了

权限设计:根据位运算的特点,设计一个权限系统(添加、删除、判断等)

2. Java 位运算

2.1. Number

在讲位运算之前,首先简单看下 Java 中的 Number,下文需要用到。

在 Java 里,数字均为基于 IEEE 754 标准的双精度 64 位的浮点数,引用维基百科的图片,它的结构长这样:

be2480b696d606441e832524b24d32f1.png

sign bit(符号): 用来表示正负号

exponent(指数): 用来表示次方数

mantissa(尾数): 用来表示精确度

也就是说一个数字的范围只能在 -(2^53 -1) 至 2^53 -1 之间。

既然讲到这里,就多说一句:0.1 + 0.2 算不准的原因也在于此。浮点数用二进制表达时是无穷的,且最多 53 位,必须截断,进而产生误差。最简单的解决办法就是放大一定倍数变成整数,计算完成后再缩小。不过更稳妥的办法是使用下文将会提到的 math.js 等工具库。

此外还有四种数字进制:

// 十进制

123456789

0

// 二进制:前缀 0b,0B

0b10000000000000000000000000000000// 2147483648

0b01111111100000000000000000000000// 2139095040

0B00000000011111111111111111111111// 8388607

// 八进制:前缀 0o,0O(以前支持前缀 0)

0o755// 493

0o644// 420

// 十六进制:前缀 0x,0X

0xFFFFFFFFFFFFFFFFF// 295147905179352830000

0x123456789ABCDEF// 81985529216486900

0XA// 10

好了,Number 就说这么多,接下来看 Java 中的位运算。

2.2. 位运算

按位操作符将其操作数当作 32 位的比特序列(由 0 和 1 组成)操作,返回值依然是标准的 Java 数值。Java 中的按位操作符有:

运算符

用法

描述

按位与(AND)

a & b

对于每一个比特位,只有两个操作数相应的比特位都是 1 时,结果才为 1,否则为 0。

按位或(OR)

a | b

对于每一个比特位,当两个操作数相应的比特位至少有一个 1 时,结果为 1,否则为 0。

按位异或(XOR)

a ^ b

对于每一个比特位,当两个操作数相应的比特位有且只有一个 1 时,结果为 1,否则为 0。

按位非(NOT)

~a

反转操作数的比特位,即 0 变成 1,1 变成 0。

左移(Left shift)

a << b

将 a 的二进制形式向左移 b (< 32) 比特位,右边用 0 填充。

有符号右移

a >> b

将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。

无符号右移

a >>> b

将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

下面举几个例子,主要看下AND和OR:

#例子1

A = 10001001

B = 10010000

A | B = 10011001

#例子2

A = 10001001

C = 10001000

A | C = 10001001

#例子1

A = 10001001

B = 10010000

A & B = 10000000

#例子2

A = 10001001

C = 10001000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值