75

「ビット演算子とは何ですか?」を読みました。、したがって、ビット演算子が何であるか はわかっていますが、それらをどのように使用できるかはまだわかりません。誰かがJavaScriptでビット演算子が役立つ実際の例を提供できますか?

ありがとう。

編集:

jQueryソースを掘り下げると、ビット演算子が使用されている場所がいくつか見つかりました。たとえば、次のようになります。(&演算子のみ)

// Line 2756:
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));

// Line 2101
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
4

16 に答える 16

72

例:

16 進値を解析して RGB カラー値を取得します。

var hex = 'ffaadd';
var rgb = parseInt(hex, 16); // rgb is 16755421


var red   = (rgb >> 16) & 0xFF; // returns 255
var green = (rgb >> 8) & 0xFF;  // 170
var blue  = rgb & 0xFF;     // 221  
于 2009-03-17T12:52:28.350 に答える
47

私は実動スクリプトでの数値変換にビット単位の演算子を多用MathしていますparseInt

私が支払わなければならない代償は、コードの読みやすさです。そのため、私は通常Math、開発ではビットごとに使用し、本番ではビットごとに使用します。

jsperf.com でいくつかのパフォーマンスの秘訣を見つけることができます

ご覧のとおり、ブラウザは何年も最適化されていないMath.ceilため、フルレでもparseIntビット単位の方が高速で短い方法になると予測しています。

SOについてさらに読む...


おまけ:のチート シート:何 | 0でも整数に変換する簡単で高速な方法:

( 3|0 ) === 3;             // it does not change integers
( 3.3|0 ) === 3;           // it casts off the fractional part in fractionalal numbers
( 3.8|0 ) === 3;           // it does not round, but exactly casts off the fractional part
( -3.3|0 ) === -3;         // including negative fractional numbers
( -3.8|0 ) === -3;         // which have Math.floor(-3.3) == Math.floor(-3.8) == -4
( "3"|0 ) === 3;           // strings with numbers are typecast to integers
( "3.8"|0 ) === 3;         // during this the fractional part is cast off too
( "-3.8"|0 ) === -3;       // including negative fractional numbers
( NaN|0 ) === 0;           // NaN is typecast to 0
( Infinity|0 ) === 0;      // the typecast to 0 occurs with the Infinity
( -Infinity|0 ) === 0;     // and with -Infinity
( null|0 ) === 0;          // and with null,
( (void 0)|0 ) === 0;      // and with undefined
( []|0 ) === 0;            // and with an empty array
( [3]|0 ) === 3;           // but an array with one number is typecast to number
( [-3.8]|0 ) === -3;       // including the cast off of the fractional part
( [" -3.8 "]|0 ) === -3;   // including the typecast of strings to numbers
( [-3.8, 22]|0 ) === 0     // but an Array with several numbers is typecast to 0
( {}|0 ) === 0;                // an empty object is typecast to 0
( {'2':'3'}|0 ) === 0;         // or a not empty object
( (function(){})|0 ) === 0;    // an empty function is typecast to 0 too
( (function(){ return 3;})|0 ) === 0;

そして私のためのいくつかの魔法:

3 | '0px' === 3;
于 2013-03-27T17:00:57.747 に答える
25

JavaScriptでは、(正の数の場合)または(負の場合でも)~~nの代わりに、ダブルビット単位の否定()を使用できます。常にと同じ結果が得られます。Math.floor(n)nparseInt(n, 10)nn|nn&n~~n

var n = Math.PI;
n; // 3.141592653589793
Math.floor(n); // 3
parseInt(n, 10); // 3
~~n; // 3
n|n; // 3
n&n; // 3

// ~~n works as a replacement for parseInt() with negative numbers…
~~(-n); // -3
(-n)|(-n); // -3
(-n)&(-n); // -3
parseInt(-n, 10); // -3
// …although it doesn’t replace Math.floor() for negative numbers
Math.floor(-n); // -4

単一のビット単位の否定(~)はを計算する-(parseInt(n, 10) + 1)ため、2つのビット単位の否定は。を返し-(-(parseInt(n, 10) + 1) + 1)ます。

n|nこれらの3つの選択肢のうち、最も速いように見えることに注意してください。

更新:ここでより正確なベンチマーク:http://jsperf.com/rounding-numbers-down

(奇妙な言語機能に投稿されているように)

于 2010-02-08T19:36:48.470 に答える
22

^トグラーとしてのビット単位の XOR

value ^= 1valueto を呼び出すたびに変更されます0, 1, 0, 1, ... (基本的には : に似ていますboolVal != boolVal):

function toggle(evt) {
  const EL = evt.currentTarget;
  EL.isOn ^= 1; // Bitwise toggle
  EL.textContent = EL.isOn ? "ON" : "OFF"; // Unleash your ideas
}

document.querySelectorAll("button").forEach( el =>
  el.addEventListener("click", toggle)
);
<button>OFF</button>
<button>OFF</button>
<button>OFF</button>

于 2014-02-27T06:58:50.170 に答える
16

Javascript の進歩 (特に js を使用したサーバー側プログラミングを可能にする nodejs の場合) を考えると、JS のコードはますます複雑になっています。以下に、ビット単位の演算子を使用した例をいくつか示します。

  • IP アドレス操作:

    //computes the broadcast address based on the mask and a host address
    broadcast = (ip & mask) | (mask ^ 0xFFFFFFFF)
    
    
    //converts a number to an ip adress 
    sprintf(ip, "%i.%i.%i.%i", ((ip_int >> 24) & 0x000000FF),
                             ((ip_int >> 16) & 0x000000FF),
                             ((ip_int >>  8) & 0x000000FF),
                             ( ip_int        & 0x000000FF));
    

注: これは C コードですが、JS はほとんど同じです

  • CRCアルゴリズムはそれらをよく使用します

これに関するウィキペディアのエントリをチェックしてください

  • 画面解像度の操作
于 2009-03-17T12:49:00.323 に答える
14

数値が奇数かどうかを判断するには:

function isOdd(number) {
    return !!(number & 1);
}

isOdd(1); // true, 1 is odd
isOdd(2); // false, 2 is not odd
isOdd(357); // true, 357 is odd

モジュラスよりも高速 - パフォーマンスが本当に重要な場所で使用してください!

于 2014-06-27T19:39:49.850 に答える
11

bitwise not と double bitwise not を使用する方法の他のいくつかの例:

フロア運営

~~2.5    // 2
~~2.1    // 2
~~(-2.5) // -2

indexOf が -1 を返したかどうかを確認する

var foo = 'abc';
!~foo.indexOf('bar'); // true
于 2012-06-12T16:15:48.330 に答える
10

ブール値を反転するためにそれらを使用できます。

var foo = 1;
var bar = 0;
alert(foo ^= 1);
alert(bar ^= 1);

これは少しばかげていますが、ほとんどの場合、ビット単位の演算子は Javascript で多くのアプリケーションを持っていません。

于 2009-03-17T12:49:13.757 に答える
7
var arr = ['abc', 'xyz']

書いててイライラする

if (arr.indexOf('abc') > -1) {
  // 'abc' is in arr
}

if (arr.indexOf('def') === -1) {
  // 'def' is not in arr
}

何かが配列内にあるかどうかを確認するには?

~次のようにビット演算子を使用できます。

if (~arr.indexOf('abc')) {
  // 'abc' is in arr
}

if (! ~arr.indexOf('def')) {
  // 'def' is not in arr
}
于 2016-01-18T10:35:00.170 に答える
4

ビットマスク

JS イベントなどで広く使用されています。

于 2009-03-17T12:50:05.393 に答える
3

権限ウィジェットに一度使用しました。UNIX のファイル許可はビットマスクであるため、解析するにはビット操作を使用する必要があります。

于 2009-03-17T12:52:41.050 に答える
0

16 進値とビットを扱う場合、これらは非常に便利なようです。4ビットで0からFまで表現できるからです。

1111 = F 1111 1111 = FF。

于 2013-11-12T05:41:01.870 に答える
-1

ANDビット単位の演算子も&Javascriptに含まれているかどうかを確認しようとしているこの質問を見つけました。

あなたが例を求めたので:

if ($('input[id="user[privileges]"]').length > 0) {
    $('#privileges button').each(function () {
        if (parseInt($('input[id="user[privileges]"]').val()) & parseInt($(this).attr('value'))) {
            $(this).button('toggle');
        }
    });
}

非表示フィールドのビットマスク値を指定して、jQuery を使用してボタンの状態を設定します。

  • none=0
  • user=1
  • administrator=2
  • user+ administrator=3
于 2013-07-16T04:04:26.000 に答える