Незнакомые символы, используемые при шифровании JavaScript script
Вот выдержка из JS-шифрования script, который я изучаю.
function permutationGenerator(nNumElements) {
this.nNumElements = nNumElements;
this.antranspositions = new Array;
var k = 0;
for (i = 0; i < nNumElements - 1; i++)
for (j = i + 1; j < nNumElements; j++)
this.antranspositions[ k++ ] = ( i << 8 ) | j;
// keep two positions as lo and hi byte!
this.nNumtranspositions = k;
this.fromCycle = permutationGenerator_fromCycle;
}
Может ли кто-нибудь объяснить использование двойника меньше знаков < <, а также одиночной трубы |
Позже в script появляется двойной знак больше, чем знаки → , также один амперсанд и.
function permutationGenerator_fromCycle(anCycle) {
var anpermutation = new Array(this.nNumElements);
for (var i = 0; i < this.nNumElements; i++) anpermutation[i] = i;
for (var i = 0; i < anCycle.length; i++) {
var nT = this.antranspositions[anCycle[i]];
var n1 = nT & 255;
var n2 = (nT >> 8) & 255; // JC
nT = anpermutation[n1];
anpermutation[n1] = anpermutation[n2];
anpermutation[n2] = nT;
}
return anpermutation;
}
Я знаком с одиночным < или > и, конечно, логический && и логические ||.
Мысли?
Ответы
Ответ 1
Левая смена 8 бит и побитовая ИЛИ с j.
<<
- оператор сдвига влево. Сдвигает биты в переменной, оставляя указанное количество позиций.
>>
- оператор правого сдвига. Сдвигает биты в переменной справа от указанного количества.
|
является побитовым оператором OR. Выполняет логическое ИЛИ для каждого бита в двух операндах.
&
- побитовый оператор И. Выполняет логическое И для каждого бита в двух операндах.
Ответ 2
| = побитовое или
1010
0100
----
1110
& = побитовое и
1011
0110
----
0010
чтобы он был таким же, как && и || просто с одиночными битами
< < левый сдвиг, поэтому
0110 < 2 сдвигает числа, оставшиеся на две позиции, что дает 011000
другой способ думать об этом - умножение на два, поэтому x < 1 == x * 2, x < 2 == x * 2 * 2 и т.д., так что x * Math.pow(2, n ) дл х <
>>
- противоположное, поэтому 0110 → 2 --- > 0001
вы можете думать о нем как о делении на два, но с округлением вниз, поэтому он равен
Math.floor(x/Math.pow(2,n))
Ответ 3
< < является поразрядным сдвигом влево. → - поразрядный сдвиг вправо. | является побитовым ИЛИ. и побитовое И. Для получения дополнительной информации см. эту ссылку.