使用按位AND,OR和十六进制数来理解JS中的计算

时间:2016-07-23 14:14:31

标签: javascript math hex bitwise-operators

我正在尝试理解这里分享的一段代码:https://stackoverflow.com/a/2117523/2586761

// returns a valid GUID
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random() * 16 | 0;
    var v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
});
// "3bce4931-6c75-41ab-afe0-2ec108a30860"

我从问题Using bitwise OR 0 to floor a number中理解,3.142 | 0将通过截断分数返回一个整数,但我猜测何时将其应用于十六进制数字,并在我们然后丢失时丢失或者像:randomNumber & 0x3 | 0x8

我发现十六进制值有一个toString方法(数字没有!):

0x3.toString() // returns '3'

而且我猜测randomNumber & 0x3 | 0x8可能会返回一个两位值,这是一个ascii字符(不只是一个数字)在所需的范围内...但我猜,我不能找到一个很好的参考资料,让我了解整个情况。

任何人都可以引导我/建议参考吗?

这个问题似乎有关系,但没有具体处理JS,或者与我的例子相符:bitwise and logical AND/OR in terms of hex result

更新

我已经注意到原始问题上有很多很好的答案可以探究这个问题,特别是https://stackoverflow.com/a/28921801/2586761,但没有一个能回答我的所有问题。

特别是,如果不使用String.fromCharCode()之类的内容,数字如何转换为字符?

1 个答案:

答案 0 :(得分:4)

不,&|都没有执行转换为ASCII字符,此转换由最后一个v.toString(16)执行。 &|只需执行按位操作。

在函数的第二行之前,r包含0x00xf之间的随机整数。它可以用四位表示:r == abcd,其中a,b,c和d为0或1.

r & 0x3使除了后两位之外的所有内容无效(因为3是二进制11)。所以,r & 0x3 == 00cd。

| 0x8设置第一位(因为8是二进制1000)。所以,r & 0x3 | 0x8 == 10cd。

结果,整个表达式r & 0x3 | 0x8占用r的两个最低有效位并将它们附加到二进制10.在此操作之前,我们可以有从0x0到0xf的任何数字,但仅在它之后有四种变体:0x8(二进制1000),0x9(二进制1001),0xa(二进制1010)或0xb(二进制1011)。