的JavaScript。 | &安培;和toString

时间:2012-05-24 19:33:59

标签: javascript operators

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

请帮帮我。我不明白这个运算符(|和&)的工作原理以及为什么这段代码会返回a-f符号?

2 个答案:

答案 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)输出结果,因此得到89a(基数为16的十位)或{{1} (这是十一)。