我试图理解这里共享的一段代码: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"
我从这个问题了解使用按位或0到地板上的号码,一个3.142 | 0
将被截断的部分返回一个整数,但是当涉及到将其应用到十六进制数我猜,失去时,我们再或者像:randomNumber & 0x3 | 0x8
。
我发现十六进制值有一个toString
方法(数字没有!):
0x3.toString() // returns '3'
而且我猜想可能randomNumber & 0x3 | 0x8
正在返回一个两位值,该值是所需范围内的ascii字符(不仅是数字)……但是我猜到了,我找不到一个很好的引用,它给了我整个图片。
谁能一步步指导我/提供参考?
这个问题似乎相关,但是并没有专门针对JS,也没有与我的示例匹配:就十六进制结果而言,按位与逻辑AND / OR
从那以后,我注意到在探索该问题的原始问题上有很多很好的答案,尤其是https://stackoverflow.com/a/28921801/2586761,但是没有一个答案能回答我的所有问题。
特别是,如何不使用数字将数字转换为字符String.fromCharCode()
?
不,既不执行&
也不|
转换为ASCII字符,此转换由last进行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)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句