我正在尝试理解这里分享的一段代码: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()
之类的内容,数字如何转换为字符?
答案 0 :(得分:4)
不,&
和|
都没有执行转换为ASCII字符,此转换由最后一个v.toString(16)
执行。 &
和|
只需执行按位操作。
在函数的第二行之前,r
包含0x0
和0xf
之间的随机整数。它可以用四位表示: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)。