Незнакомые символы, используемые при шифровании 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

< < является поразрядным сдвигом влево. → - поразрядный сдвиг вправо. | является побитовым ИЛИ. и побитовое И. Для получения дополнительной информации см. эту ссылку.