Understanding bitwise operations in javascript

后端 未结 4 1520
时光说笑
时光说笑 2020-12-15 01:36

I am currently storing data inside an XML doc as binary, 20 digits long, each representing a boolean value.



        
相关标签:
4条回答
  • 2020-12-15 02:19

    Single ampersand (&, as opposed to &&) does bit-wise comparison. But first you need to convert your strings to numbers using parseInt().

    var map = parseInt("10010", 2); // the 2 tells it to treat the string as binary
    
    var maskForOperation1 = parseInt("10000", 2);
    var maskForOperation2 = parseInt("01000", 2);
    // ...
    
    if (map & maskForOperation1) { Operation1(); }
    if (map & maskForOperation2) { Operation2(); }
    // ...
    
    0 讨论(0)
  • 2020-12-15 02:24

    Bitwise operators will certainly be faster but only linearly and not by much. You'll probably save a few milliseconds (unless you're processing HUGE amounts of data in Javascript, which is most likely a bad idea anyway).

    You should think about profiling other code in your loop to see what's slowing it down the most. What other algorithms, data structures and allocations do you have in there that could use refactoring?

    0 讨论(0)
  • 2020-12-15 02:37

    Be extremely wary. Javascript does not have integers -- numbers are stored as 64 bit floating-point. You should get accurate conversion out to 52 bits. If you get more flags than that, bad things will happen as your "number" gets rounded to the nearest representable floating-point number. (ouch!)

    Also, bitwise manipulation will not help performance, because the floating point number will be converted to an integer, tested, and then converted back.

    If you have several places that you want to check the flags, I'd set the flags on an object, preferably with names, like so:

    var flags = {};
    flags.use_apples = map.charAt(4);
    flags.use_bananas = map.charAt(10);
    

    etc...

    Then you can test those flags inside your loop:

    if(flags.use_apples) {
        do_apple_thing();
    }
    

    An object slot test will be faster than a bitwise check, since Javascript is not optimized for bitwise operators. However, if your loop is slow, I fear that decoding these flags is probably not the source of the slowness.

    0 讨论(0)
  • 2020-12-15 02:38

    Assuming you have no more than 32 bits, you can use JavaScript's built-in parseInt() function to convert your string of 1s and 0s into an integer, and then test the flags using the & (and) operator:

    var flags = parseInt("10001010100011110000", 2); // base 2
    
    if ( flags & 0x1 )
    {
       // do something
    }
    
    ...
    

    See also: How to check my byte flag?

    (question is on the use in C, but applies to the same operators in JS as well)

    0 讨论(0)
提交回复
热议问题