理解基础16中的Javascript函数

时间:2014-06-13 10:28:12

标签: javascript hex

我在JavaScript中使用了这个非常有用且干净的小功能:

CreateGuid: function () {
        var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0,
                v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });

        return guid;
    },

我想稍微修改它以便能够随机生成字母数字序列。

我不支持的这个功能的唯一部分是:

r : (r & 0x3 | 0x8)

除了这是一个三元运算符这是做什么的呢?

2 个答案:

答案 0 :(得分:5)

如果你看一下0x3和0x8的二进制写法可能会更清楚:

 0x3.toString(2) => 11
 0x8.toString(2) => 1000

我们在这里做的是按位操作:

  • 首先在位级and 11(截断到最后两位,即%4},

  • 然后or 1000(设置一位,添加8)。

整体可能不那么容易直接写成

var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
.replace(/x/g, function(){
   return  (Math.random()*16|0).toString(16)
})
.replace(/y/, function(){
   return  (Math.random()*4+8|0).toString(16)
})

答案 1 :(得分:2)

看起来相当于r % 4 + 8

http://jsfiddle.net/8TFMg/1/

0 & 0x3 | 0x8 = 8
1 & 0x3 | 0x8 = 9
2 & 0x3 | 0x8 = 10
3 & 0x3 | 0x8 = 11
4 & 0x3 | 0x8 = 8
5 & 0x3 | 0x8 = 9
6 & 0x3 | 0x8 = 10
7 & 0x3 | 0x8 = 11
8 & 0x3 | 0x8 = 8
9 & 0x3 | 0x8 = 9
10 & 0x3 | 0x8 = 10
11 & 0x3 | 0x8 = 11
12 & 0x3 | 0x8 = 8
13 & 0x3 | 0x8 = 9
14 & 0x3 | 0x8 = 10
15 & 0x3 | 0x8 = 11