1
var ddd = Math.random() * 16;    
console.log((ddd & 3 | 8).toString(16));

请帮帮我。我不明白这个运算符(| 和 &)是如何工作的,为什么这个代码返回 af 符号?

4

2 回答 2

5

该表达式ddd & 2 | 8通过对 8 的按位 OR 运算和ddd与 2 的按位 AND 运算进行按位运算。如果您不了解按位运算,您应该查阅这篇文章来解释它们是什么。

代码可以返回 af 范围内的字符,因为您将 radix 参数传递16Number.toString原型方法,这意味着它将以十六进制显示数字。

于 2012-05-24T19:37:51.840 回答
4

这会选择一个从 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(十一)。

于 2012-05-24T19:48:27.603 回答