使用按位与、或和十六进制数理解 JS 中的计算

Understanding calculations in JS using bitwise AND, OR, and hex numbers

我正在尝试理解此处共享的一段代码:

// 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 将通过截断分数来 return 一个整数,但我猜测将其应用于十六进制数时,当我们然后或喜欢时迷路了:randomNumber & 0x3 | 0x8.

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

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

我猜也许 randomNumber & 0x3 | 0x8 正在 returning 一个两位值,它是所需范围内的 ascii 字符(不仅仅是数字)...但我猜测,我找不到一个很好的参考来让我了解整个情况。

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

这个问题似乎相关,但没有专门针对 JS,或者与我的示例匹配:bitwise and logical AND/OR in terms of hex result


更新:

从那以后,我注意到在探索这个问题的原始问题上有很多很好的答案,特别是 ,但其中 none 回答了我所有的问题..

特别是,如何在不使用类似 String.fromCharCode() 的情况下将数字转换为字符?

没有,&|都没有进行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 | 0x8r 的两个最低有效位并将它们附加到二进制 10。在此操作之前我们可以有从 0x0 到 0xf 的任何数字,但在之后它只有四种可能的变体:0x8(二进制 1000)、0x9(二进制 1001)、0xa(二进制 1010)或 0xb(二进制 1011)。