原标题:JavaScript 中的位运算和权限设计
作者:云音乐前端团队
https://musicfe.dev/java-bitwise-operators/
1. 内容概要
本文主要讨论以下两个问题:
Java 的位运算:先简单回顾下位运算,平时用的少,相信不少人和我一样忘的差不多了
权限设计:根据位运算的特点,设计一个权限系统(添加、删除、判断等)
2. Java 位运算
2.1. Number
在讲位运算之前,首先简单看下 Java 中的 Number,下文需要用到。
在 Java 里,数字均为基于 IEEE 754 标准的双精度 64 位的浮点数,引用维基百科的图片,它的结构长这样:
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