代码之家  ›  专栏  ›  技术社区  ›  Greg

JavaScript逐位操作

  •  1
  • Greg  · 技术社区  · 14 年前

    我想存储在一个单一的变量,通过使用按位操作时,按下和释放键当前按下的所有键码。

    提前谢谢!

    4 回复  |  直到 14 年前
        1
  •  3
  •   Felix Kling    14 年前

    我认为这不可能是你想要的方式。 Have a look at the available keycodes backspace 8 tab 9 .

    1000 1001 . 使用二进制运算符,可以使用或 | 1001 .

    检查是否通过和设置了值 & & 1000 true 如果只按了tab键(按其值 ).

    也就是说,如果要测试的不同值是2的幂,则只能使用这种逐位比较技术 只有 1 , 10 , 100 , ,...

    status 变量和可能的状态是 OPEN = 2 , LIGHT ON = 4 ALARM ON = 8 .
    假设是这样 OPEN LIGHT ON ,即。

      0010
    | 0100
    ------- 
      0110
    

    ALARM 0110 & 1000 = 0 ALARM ON 具有 6 = 0110 ,我们无法检查此项。


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

    我希望我的解释是清楚的。

        2
  •  5
  •   Randy the Dev    14 年前

    这在技术上是不可能在单个变量中实现的,javascript中的任何数据类型都不能存储保存位掩码所需的256位(它支持按位操作),您将需要使用数组来代替。

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

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

    这是唯一的办法。实际上没有别的了。

        3
  •  0
  •   lincolnk    14 年前

    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 ...
    
    }
    
        4
  •  0
  •   jusopi    11 年前

    我不确定JavaScript中是否有ByteArray这样的东西,但是如果是这样的话,你可以像这个家伙在ActionScript3中那样做。虽然我是位标志和位操作的超级粉丝,但我不了解他正在做的位转换,他的大部分代码都是我无法理解的。我只知道它在我做过的3个项目中都能用。

    另外,如果您想了解有关位标志和位操作的更多信息(除了位移位),请参阅本文- 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;