在网上看到一段代码,
pairs.add((i << 16) | j);//i和j是整数
.......
.......
pairs.forEach((key) => {
var i = (key >> 16) & 0xffff;
var j = key & 0xffff;
.......
});
<<,|,&是位运算符,它们的意义我明白,但是这种写法不太明白是表达或计算什么。
pairs中把ij合并成了一个数字,而通过下面的forEach又把数字还原回来了,感觉不像加密。
倒推回去i = (key >> 16) & 0xffff;j = key & 0xffff;
那么((i << 16) | j)=(((key >> 16) & 0xffff) << 16)|(key & 0xffff)=(key & (0xffff<<16))|(key & 0xffff),前者取key的高16位,后者取key的低16位,两者进行或运算就成了key,这是把两个数组成一个数储存,用的时候再解析出来。再根据pairs这个结构的命名,可能是一种tuple的js实现?
做加密?
首先假定你的key是四个字节长度
假定你这个key的值是0x12345678(十六进制的1位是二进制的4个bit位,四个字节就是32bit位)
那么key右移16位的值是0x????1234(?表示随机值,也可能是0),那么&0xffff之后,得出的位值就是0x00001234,也就是i=0x1234
而key直接&0xffff,得出的位值是0x00005678,也就是j=0x5678
说白了,i取key的前两字节的值,j取key后两字节的值
0x????1234 &
0x0000ffff =
0x00001234
0x12345678 &
0x0000ffff =
0x00005678
看明白作用了吗
如果回答对你有用,记得采纳