前の言葉
ビットオペレーターは非常に根本的な操作であり、直感的ではないため、一般的に使用されていません。ただし、非常に高速であり、合理的に使用すると良い結果を達成できます。この記事では、javascript -bitオペレーターでしばしば見落とされがちなオペレーターを紹介します
バイナリ表現
ECMAScriptのすべての値はIEEE-754 64ビット形式で保存されますが、ビット演算子は64ビット値を直接動作させませんが、32ビットの署名整数として計算され、リターン値は32ビットの署名整数です。
このビット変換により、特別なNAN値にビット操作を適用すると、両方の値を0として扱うことができます。
ビット演算子が非数値値に適用される場合、値は最初に数値()を使用して数値に変換され、結果は数値です
// '|'ビットワイズまたは整数と0ビットワイズまたは操作はそれ自体を取得でき、小数点と0ビットワイズまたは操作は丸め効果コンソール(1.3 | 0); 0); // 0Console.log( '12px' | 0); // 0console.log('12 '| 0); // 12
署名された整数は、32ビットの最初の31を使用して整数値を表し、32ビットを表して整数記号を表し、0は正の数を表し、1は負の数を表します。シンボルを表すビットは記号ビットと呼ばれ、サインビットの値は他のビット値の形式を決定します。その中で、正の数は純粋なバイナリ形式で保存され、31ビットのそれぞれは2のパワーを表します。最初のビット(ビット0と呼ばれる)は2の0回を表し、2番目のビットは2の1時間などを表します。未使用のビットは0で満たされています。つまり、無視されます。
たとえば、数値18のバイナリ表現は0000000000000000000000000010010、またはより簡潔な10010です。これらは5つの有効なビットであり、これらの5ビット自体が実際の値を決定します
console.log((18).toString(2)); // "10010"
console.log(0b000000000000000000000000000000000010010); // 18
負の数もバイナリに保存されますが、使用される形式は2つの補数です。数値2の補数を計算するには、次の3つの手順を実行する必要があります。
【1
【2】バイナリ逆コードを見つけます。つまり、0を1に置き換え、1を0に置き換えます
【3】得られたバイナリ逆コードが1に追加されます
たとえば、-18のバイナリ表現を決定するには、以下に示すように、最初に18のバイナリ表現を取得する必要があります。
0000 0000 0000 0000 0000 0000 0001 0010
次に、次のようにバイナリ逆コードを計算します。
1111 1111 1111 1111 1111 1111 1111 1110 1101
最後に、次のように、バイナリ逆コードに1を追加します。
1111 1111 1111 1111 1111 1111 1110 1101 1------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
したがって、-18のバイナリ表現は1111 1111 1111 1111 1111 1111 1111 1110 1110です
ECMAScriptは、このすべての情報を当社から隠すために最善を尽くします。バイナリ文字列の形で負の数を出力する場合、この負の数の絶対値を持つバイナリコードには、負の記号が前にあるということです。
var num = -18; console.log(num.tostring(2)); // '-10010'
ビット演算子は、ビットワイズの非(not)、ビットワイズ、ビットワイズまたは(または)、ビットワイズ排他的または(XOR)、左シフト、右シフト、無署名の右シフトなど、7種類の操作を実行できます。
ビットワイズ以外(そうではありません)
ビットごとの非操作者は、波状の線(〜)で表されます。ビットワイズの非オペレーターを実行した結果は、値の逆コードを返すことです。その本質は、オペランドの負の値を1で引いたことです
var num1 = 25; var num2 = 〜num1; console.log(num2); //-26
整数の場合、丸み効果を2倍にすることができます。小数については、丸め効果を2倍にすることができます。
console.log(~~ 3); // 3console.log(~~ 3.1); // 3console.log(~~ 3.9); // 3
ビットワイズと(そして)
ビットワイズと演算子は、2つの演算子番号を持つ合計記号(&)で表されます。基本的に、ビットワイズと操作は、2つの値の各ビットを整列させ、次の表のルールに従って同じ位置で2つの数値で操作を実行します。
2番目の値ビット結果の最初の値ビット結果1 1 11 0 00 1 00 0 0 0 0
ビットワイズと操作は、2つの値の対応するビットが1の場合にのみ1を返します。ビットは0で、結果は0です。
var iresult = 25&3; console.log(iresult); // "1"
//分析は次のとおりです25 = 0000 0000 0000 0000 0000 00000000 0001 1001 3 = 0000 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000 0000000000000000000000000000000000000000000000000000 0001
ビットワイズまたは(または)
ビットワイズまたは演算子は垂直記号(|)で表され、2つのオペランドもあります。ビットワイズまたは操作は、次の真理テーブルに従います
2番目の値ビット結果の最初の値ビット結果1 1 11 0 10 1 10 0 0 0
ビットワイズまたは操作は、1ビットが1の場合、両方のビットが0の場合にのみ1を返します。
var iresult = 25 | 3; console.log(iresult); // "27"
//分析は次のとおりです25 = 0000 0000 0000 0000 0000 00000000 0001 1001 3 = 0000 0000 0000 00000000000000000000 0001 1011
整数と0ビットワイズまたは操作が取得でき、小数点と0個のビットワイズまたは操作が丸め効果を得ることができます
console.log(3.1 | 0); // 3console.log(3.9 | 0); // 3
bitwise xor(xor)
Bitwise XOR演算子はCARET(^)で表され、2つのオペランドがあります。以下は、ビットワイズXORの真理テーブルです
最初の値のビット2番目の値のビット1 1 01 0 10 1 10 0 0 0
bitwise xorの2つの値が同じである場合は0を返し、同時にない場合に1を返します1
var iresult = 25 ^ 3; console.log(iresult); // "26"
//分析は次のとおりです25 = 0000 0000 0000 0000 0000 00000000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0001 1010
「Exoroor Operation」には特別な用途があり、2つの数値AとBで3つのXOR操作を連続して実行します。Aˆ = B、Bˆ = A、Aˆ = B、およびそれらの値を交換できます。これは、「排他的または操作」を使用すると、一時変数を導入せずに2つの変数の値を交換できることを意味します
var a = 10、b = 9; a ^= b、b ^= a、a ^= b; console.log(a、b); // 9,10
//分析は次のとおりですa = 0000 0000 0000 0000 0000 000000000000000000000000000000000000000000000000000000000000000000000000 0011 0011 0000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 1001----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0ビットワイズXORを持つ整数はそれ自体を維持でき、0ビットワイズXORの小数点以下は丸くすることができます
console.log(3.1 ^ 0); // 3console.log(3.9 ^ 0); // 3
左に移動します
左シフト演算子は、標識(<<)より2つの少ない2つで表されます。この演算子は、指定されたビット数によって、値のすべてのビットを左に移動します。
たとえば、値2(バイナリコードが10)が左に5ビットシフトされている場合、結果は64(1000000)になります
var oldvalue = 2; var newValue = oldValue << 5; console.log(newValue); // 64
左に移動しても、オペランドのサインビットには影響しません。言い換えれば、-2が左に5ビットを移動すると、結果は-64になります
var oldvalue = -2; var newValue = oldValue << 5; console.log(newValue); // -64
左シフト0ビットは、丸め効果を達成できます
console.log(3.1 << 0); // 3console.log(3.9 << 0); // 3
右に署名しました
署名された右シフト演算子は、値を右に移動する2つの標識(>>)で表されますが、記号ビット(つまり、符号マーク)を保持します。署名された右シフト操作は、左シフト操作の正反対です。つまり、64が右に5ビット移動すると、結果は2に戻ります。
var oldvalue = 64; var newValue = oldValue >> 5; console.log(newValue); // 2
同様に、シフトプロセス中に、空室も元の値に表示されます。ただし、今回は空室が元の値の左側とサインビットの右側に表示されます。現時点では、ECMAScriptはすべての空のスペースを記号ビットの値で満たし、完全な値を取得します
右に移動して、2の除数操作をシミュレートします
console.log(5 >> 1); // 2console.log(15 >> 1); // 7
署名されていない権利
署名されていない右シフト演算子は、32ビットのすべての値を右に移動するサイン(>>>)より大きい3つのサイン(>>>)で表されます。正の数の場合、署名されていない右シフトの結果は、署名された右シフトと同じです。標識をその前に移動すると便利です。符号なしの64 x 5ビットを移動すると、結果はまだ2です
var oldvalue = 64; var newValue = oldValue >>> 5; console.log(newValue); // 2
ただし、負の数は異なります。最初に、署名された右シフトのように署名されたビットの値で空のビットを埋めるのではなく、署名されていない右シフトが空のビットを0で満たします。したがって、署名されていない正しい数値へのシフトの結果は、タイトルシフトのタイトルへのシフトの結果と同じですが、負の数の結果は異なります。第二に、署名されていない右シフト演算子は、ネガティブバイナリコードを正のバイナリコードとして扱います。さらに、負の数は2つの絶対値の補完で表されているため、結果は署名されていない正しいシフトの後に非常に大きくなります。
var oldvalue = -64; var newValue = oldValue >>> 5; console.log(newValue)// 134217726
-64のバイナリ表現を決定するには、以下に示すように、最初に64のバイナリ表現を取得する必要があります。
0000 0000 0000 0000 0000 0000 0100 0000
次に、次のようにバイナリ逆コードを計算します。
1111 1111 1111 1111 1111 1111 1111 1011 11111
最後に、以下に示すようにバイナリ逆コードに1を追加します
1111 1111 1111 1111 1111 1111 1111 1011 1111 1----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下に示すように、5ビットを右に移動した後:
0000 0111 1111 1111 1111 1111 11111 11111 1110CONSOLE.LOG(0B00000111111111111111111111111111111111111111111111111110); // 134217726
一般的なアプリケーション
【1】複数操作
左シフト(<<)を使用して、乗算操作を実現します
console.log(2 << 1); // 4console.log(3 << 1); // 6console.log(4 << 1); // 8
【2】操作を分割します
署名された右シフト(>>)を使用して、2の除数操作をシミュレートします
console.log(2 >> 1); // 1console.log(5 >> 1); // 2console.log(8 >> 1); // 4console.log(9 >> 1); // 4console.log(9 >> 1); // 4 4
【3】値スワップ
値の交換の効果は、XOR操作(^)を使用して達成できます
var a = 10、b = 9; a ^= b、b ^= a、a ^= b; console.log(a、b); // 9,10
【4】10進を要約します
小数点の丸め効果は、0ビットワイズ、または0ビット単位または0ビットと0ビットの右ビット、0ビット単位、または右に0ビット単位または0ビットを摂取することで実現できます。
console.log(~~ 3.1); // 3console.log(3.1 | 0); // 3console.log(3.1^0); // 3console.log(3.1 << 0); // 3console.log(3.1 >> 0); // 3console.log(3.1 >> 0); // 3
【5】スイッチ
ビット演算子は、オブジェクトプロパティを設定するスイッチとして使用できます。オブジェクトには4つのスイッチがあり、各スイッチが変数であると仮定します。次に、4ビットのバイナリ番号を設定できますが、それぞれがスイッチに対応します。
var flag_a = 1; // 0001var flag_b = 2; // 0010var flag_c = 4; // 0100var flag_d = 8; // 1000
上記のコードは、4つのスイッチA、B、C、およびDを設定します。各スイッチにはそれぞれバイナリビットがあります。
ここで、3つのABDスイッチをオンにする必要があると仮定します。マスク変数を作成できるとします
var mask = flag_a | flag_b | flag_d; // 0001 | 0010 | 1000 => 1011
上記のコードは、3つの変数ABDで「または操作」を実行して、バイナリのマスク値で1011を取得します
//「操作」により、指定されたスイッチがフラグをオンにすることを保証します=フラグ|マスク;
//「Association」は、スイッチ設定とは異なる現在の設定のすべてのアイテムをオフにすることができます。 flags = flags&mask;
//「排他的または操作」は、現在の設定に切り替えることができます。つまり、現在の設定の逆値を初めて取得でき、元の値を再度実行することで取得できます。フラグ=フラグ ^マスク;
//「操作なし」は現在の設定を反転させることができます。つまり、元の設定は0で、操作後1になります。元の設定は1で、操作=〜フラグの後に0flagsになります。
JavaScriptオペレーターの上記の包括的な紹介-BITオペレーターは、エディターが共有するコンテンツ全体です。私はそれがあなたに参照を与えることができることを願っています、そして私はあなたがwulin.comをもっとサポートすることを願っています。