JavaScript Bitwise操作

时间:2010-09-23 21:39:23

标签: javascript bit-manipulation bitwise-operators

我想将所有当前按下的密钥代码存储在单个变量中,方法是在按下该键时以及释放该密钥时使用按位操作。

我不确定如何正确使用按位操作,但我知道这对于那些做某事的人来说非常简单。

完成后,通过询问“变量中的密钥是否为代码?”来查看当前哪个密钥应该很简单。

提前致谢!

4 个答案:

答案 0 :(得分:5)

这在单个变量中是不可能的,javascript中没有数据类型可以存储保持位掩码所需的256位(支持按位操作),你需要使用数组。

此外,除非你有一个文本到语音软件,你已经宏,为你神奇地执行js函数,问你的计算机:“这个键的代码在变量中吗?”不会蹲下来。

你要这样做的方法是初始化一个包含256个索引的数组,然后当按下一个键时,你会找到相关的索引并将其设置为true,当一个键被释放时,你设置它到false

这是唯一的方法。实际上没有任何其他。

答案 1 :(得分:3)

我认为你想要的方式不可能。 Have a look at the available keycodes。在那里,你看,例如, backspace8tab9

在二进制文件中,这将是10001001。使用二元运算符,您可以使用OR |来“组合”这些值,这将导致1001

您可以检查是否通过AND &设置了值,例如1001&如果按下退格键,1000可以查看。不幸的是,如果仅按Tab键(因为其值为true),这也将评估为1001

那就是说,你只能使用这种按位比较技术,如果要测试的不同值是2 的幂,即1,2,4,8,16,32等等on,因为它代表二进制1101001000,...

例如,如果我们可以有一个status变量,可能的状态为OPEN = 2LIGHT ON = 4ALARM ON = 8
假设它是OPENLIGHT ON,即

  0010
| 0100
------- 
  0110

在这里,我们可以轻松检查ALARM是否已开启,使用AND:0110 & 1000 = 0。但是,如果我们使用ALARM ON6 = 0110进行编码,则无法检查此内容。


您可以做的是,将键码映射到2值的某个幂并在那里应用二进制运算。 The Wikipedia article about bitmasks might be worth reading.

我希望我的解释有点清楚。

答案 2 :(得分:0)

对于前31位,javascript位操作通常是可靠的,并且事情从那里开始走下坡路。因此,您可以使用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 ...

}

答案 3 :(得分:0)

我不确定在JavaScript中是否存在像ByteArray这样的东西,但如果是这样的话,你可以做得很像这个人在ActionScript3中的逻辑。虽然我是bitflags&amp;的忠实粉丝。按位操作,我没有得到他正在做的位移,他的大部分代码都在我脑海中。我只知道它适用于我所参与的as3项目。

此外,如果您想了解更多关于bitflags&amp; amp;按位操作(除了位移)请查看本文 - 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;