Javascript. | & and toString

Javascript. | & and toString

本文关键字:and toString amp Javascript      更新时间:2023-09-26
var ddd = Math.random() * 16;    
console.log((ddd & 3 | 8).toString(16));

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

表达式 ddd & 2 | 8 通过采用 8 的按位 OR 运算以及 ddd 和 2 的按位 AND 运算来执行按位算术。如果您不了解按位运算,则应参阅本文来解释它们是什么。

该代码可以返回 a-f 范围内的字符,因为您传入了基数参数16 Number.toString prototype 方法,这意味着它将以十六进制显示数字。

这会从 0 到 15 中选择一个随机实数:

var ddd = Math.random() * 16;    

例如,您可能会得到 11.114714370026688。

ddd & 3

这是数字 3 的结果的按位 AND。 要做的第一件事是从ddd中获取数字并将其转换为整数,因为没有为浮点数定义按位运算符。 所以在我的例子中,它把ddd当作整数11。

接下来它要做的是执行两个数字的二进制表示的 AND。 二进制中的 11 是 1011,3 是0011。 当你和它们在一起时,你会得到一个二进制数,除了两个数字中都有一个 1 之外,它都是零。 只有最后两位数字在两个数字中都有 1,所以结果是 0011 ,再次等于十进制 3。

| 8

到目前为止,这对结果(3)的按位OR与数字8。 OR 类似于 AND,但只要两个数字中都有 1,结果就有 1。 由于 3 在二进制中仍然0011,而 8 是1000,结果是 1011 - 回到十进制 11。

通常,上述计算将 8 位(右起第三个)设置为 1,将 4 位(右起第二个)设置为 0,而其他位则不留。最终结果是将原始随机数(在 0-15 范围内)转换为仅有的四个数字之一:8、9、10 或 11。因此,这是一种非常迂回的方式,可以生成 8 到 11 之间的随机数(包括 8 和 11)。 Math.floor(8 + Math.random()*4)会以更直接的方式做同样的事情。

然后,它以十六进制(以 16 为基数)打印结果,因此您可以得到 89a(以 16 为基数为 10)或b(以 11 为基数)。