使用按位与、或和十六进制数理解 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
包含一个介于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)。
我正在尝试理解此处共享的一段代码:
// 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
包含一个介于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)。