var ddd = Math.random() * 16;
console.log((ddd & 3 | 8).toString(16));
请帮帮我。我不明白这个运算符(|和&)的工作原理以及为什么这段代码会返回a-f符号?
答案 0 :(得分:5)
表达式ddd & 2 | 8
通过采用8的按位OR运算和ddd
和2的按位AND运算来进行逐位运算。如果你不理解按位运算,你应该咨询{{ 3}}解释它们是什么。
代码可以返回a-f范围内的字符,因为您将基数参数16
传递给this article原型方法,这意味着它将以十六进制显示数字。
答案 1 :(得分:4)
这会从0到15中选择一个随机实数:
var ddd = Math.random() * 16;
例如,您可能会收到11.114714370026688。
ddd & 3
这是数字3的结果的按位AND。首先做的是从ddd
获取数字并将其转换为整数,因为没有为浮点数定义按位运算符。所以在我的例子中,它将ddd
视为整数11。
它接下来要做的是执行两个数字的二进制表示的AND。二进制中的十一个是1011
,三个是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的十位)或{{1} (这是十一)。