Побитовые операции JavaScript - PullRequest
       7

Побитовые операции JavaScript

1 голос
/ 24 сентября 2010

Я хотел бы сохранить все нажатые в данный момент коды клавиш в одной переменной, используя побитовые операции при нажатии клавиши и при ее отпускании.

Я не уверен, как правильно использовать побитовые операции, но я знаю, что это будет очень просто для тех, кто это делает.

После завершения должно быть просто увидеть, какая клавиша в данный момент нажата, спросив "это код этой клавиши в переменной?"

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 24 сентября 2010

Это технически невозможно сделать в одной переменной, никакой тип данных в javascript не может хранить 256 битов, необходимых для хранения битовой маски (которая поддерживает побитовые операции), вместо этого вам нужно будет использовать массив.

Кроме того, если у вас нет программного обеспечения для преобразования текста в речь, которое вы макропрограммировали для магического выполнения функций js для вас, спрашивая ваш компьютер: «это код этой клавиши в переменной?»не будет приседать.

То, как вы это сделаете, будет инициализировать массив с 256 индексами, а затем, когда нажата клавиша, вы найдете соответствующий индекс и установите его на true, и когдаключ отпущен, вы устанавливаете его на false

Это единственный способ сделать это.Там на самом деле нет ничего другого.

3 голосов
/ 24 сентября 2010

Я не думаю, что это возможно, как вы хотите это сделать. Посмотрите доступные коды клавиш . Там вы видите, что, например, backspace равно 8 и tab равно 9.

В двоичном коде это будет 1000 и 1001. Используя бинарные операторы, вы бы использовали OR | для «объединения» значений, что привело бы к 1001.

Вы бы проверили, установлено ли значение с помощью AND &, например, 1001 & 1000 чтобы увидеть, была ли нажата клавиша возврата. К сожалению, это также оценило бы к true, если бы была нажата только клавиша табуляции (так как ее значение равно 1001).

Тем не менее, вы можете использовать только такие методы побитового сравнения, если различные значения, которые вы хотите проверить, являются степенями только 2 , то есть 1, 2, 4, 8, 16, 32 и т. Д. , поскольку это представляет в двоичном виде 1, 10, 100, 1000, ...

Например, если у нас может быть переменная status, возможные состояния будут OPEN = 2, LIGHT ON = 4 и ALARM ON = 8.
Предположим, что это OPEN и LIGHT ON, т.е.

  0010
| 0100
------- 
  0110

Здесь мы можем легко проверить, включен ли ALARM, используя AND: 0110 & 1000 = 0. Но если мы закодируем ALARM ON с помощью 6 = 0110, мы не сможем проверить это.


То, что вы могли бы сделать, это сопоставить коды клавиш со значением некоторой степени 2 и применить там двоичные операции. Возможно, стоит прочитать статью Википедии о битовых масках .

Надеюсь, мои объяснения были как-то ясны.

0 голосов
/ 08 августа 2013

Я не уверен, существует ли такая вещь, как ByteArray в JavaScript, но если это так, вы можете сделать это так же, как этот парень сделал свою логику в ActionScript3.Хотя я большой поклонник битовых флагов и побитовых операций, я не получаю смещения битов, которое он делает, и большая часть его кода лежит у меня над головой.Я просто знаю, что это работает в проектах as3, над которыми я работал.

Также, если вы хотите узнать больше о битовых флагах и побитовых операциях (кроме битового сдвига), прочитайте эту статью - http://jwopitz.wordpress.com/2012/02/13/using-bitflags-and-bitwise-math/

Источник - https://github.com/richardlord/Asteroids/blob/master/src/no-dependencies/net/richardlord/input/KeyPoll.as

     //init the bytearray
     _states = new ByteArray();
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );
     _states.writeUnsignedInt( 0 );

    //on a keydown listener (note the bitwise OR for adding
    _states[ event.keyCode >>> 3 ] |= 1 << ( event.keyCode & 7 );

    //on a keyup listener (note the bitwise AND plus bitwise NOT
    states[ ev.keyCode >>> 3 ] &= ~(1 << (ev.keyCode & 7));

    //check for keydown
    return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) != 0;

    //check for keyup
    return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) == 0;
0 голосов
/ 24 сентября 2010

битовые операции javascript, как правило, надежны для первых 31 бита, и оттуда дела идут вниз.Таким образом, вы можете использовать 31 различные ключи, которым вы дали значение, чтобы действовать как флаг.например, если вы хотите отследить четыре стрелки и A и B, вы бы сделали что-то вроде этого.

var KEYS = { 
    LEFT:  1 << 0,
    UP:    1 << 1,
    RIGHT: 1 << 2,
    DOWN:  1 << 3,
    A:     1 << 4,
    B:     1 << 5
}

var flags = 0;

myElement.addEventListener ('keydown', function (e) { 

    switch (e.keyCode) {

        case 37: // left
        flags = flags | KEYS.LEFT;
        break;
        case 38: // up
        flags = flags | KEYS.UP;
        break;

        ... etc ...

    }

}

} , false);

function checkKeys () {

    if ( (flags & KEYS.LEFT) === KEYS.LEFT)
        alert('LEFT key pressed');
    }

    if ( (flags & KEYS.UP) === KEYS.UP )
        alert('UP key pressed');
    }

    ... etc ...

}
...