var ddd = Math.random() * 16;
console.log((ddd & 3 | 8).toString(16));
请帮帮我。我不明白这个运算符(| 和 &)是如何工作的,为什么这个代码返回 af 符号?
var ddd = Math.random() * 16;
console.log((ddd & 3 | 8).toString(16));
请帮帮我。我不明白这个运算符(| 和 &)是如何工作的,为什么这个代码返回 af 符号?
该表达式ddd & 2 | 8
通过对 8 的按位 OR 运算和ddd
与 2 的按位 AND 运算进行按位运算。如果您不了解按位运算,您应该查阅这篇文章来解释它们是什么。
代码可以返回 af 范围内的字符,因为您将 radix 参数传递16
给Number.toString
原型方法,这意味着它将以十六进制显示数字。
这会选择一个从 0 到 15 的随机实数:
var ddd = Math.random() * 16;
例如,您可能会得到 11.114714370026688。
ddd & 3
这是结果与数字 3 的按位与。首先要做的就是从中获取数字ddd
并将其转换为整数,因为没有为浮点数定义按位运算符。所以在我的例子中,它被视为ddd
整数 11。
它要做的下一件事是对两个数字的二进制表示进行 AND 运算。二进制中的 11 is1011
和 3 is 0011
。当你将它们和在一起时,你会得到一个全为零的二进制数,除非两个数字中都有一个 1。只有最后两位数字在两个数字中都有 1,所以结果是0011
,它再次等于十进制 3。
| 8
到目前为止,这对结果 (3) 与数字 8 进行了按位或。OR 类似于 AND,但无论任何一个数字中有 1,结果都为1。因为三仍然0011
是二进制而八是1000
,所以结果是1011
- 回到十进制十一。
一般来说,上述计算将 8 位(右起第三位)设置为 1,将 4 位(右起第二个)设置为 0,而保留其他位。最终结果是获取原始随机数,范围在 0-15,并将其转换为仅有的四个数字之一:8、9、10 或 11。所以这是一种非常迂回的生成随机数的方式在 8 到 11 之间,包括在内。Math.floor(8 + Math.random()*4)
会以更直接的方式做同样的事情。
然后它以十六进制(以 16 为底)打印结果,因此您得到8
, 9
, a
(以 16 为底的十)或b
(十一)。