ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptの「&」と「|」の詳しい説明
1. はじめに:
記事を始める前に、いくつかの質問をさせてください:
var num1 = 1 & 0; console.log(num1); // 0 var num2 = 'string' & 1; console.log(num2); // 0 var num3 = true & 1; console.log(num3); // 1 var num4 = undefined | false; console.log(num4); // 0 var num5 = undefined | true; console.log(num5); // 1 var num6 = 23 & 5; console.log(num6); // 5 var num7 = 23 | 5; console.log(num7); // 23
皆さんは上記の質問に正しく答えることができましたか?以前「JavaScript の「&&」と「||」についての簡単な話」をまとめました。「&&」と「||」は論理演算式の演算子です。では、「&」や「|」は何を意味するのでしょうか?特徴は何ですか?次に、その秘密を一つ一つ明らかにしていきます。
まず、「&」と「|」はビット演算子であることを理解する必要があります。
ビット演算子は、最も基本的なレベル、つまりメモリ内の値を表すビットに基づいて値を操作するために使用されます。 ECMAScript のすべての値は IEEE-754 64 ビット形式で保存されますが、ビット演算子は 64 ビット値を直接操作しません。代わりに、最初に 64 ビット値を 32 ビット整数に変換し、次に演算を実行し、最後に結果を 64 ビットに変換します。開発者にとって、64 ビットのストレージ形式は透過的であるため、プロセス全体が 32 ビットの整数のみが存在しているように見えます。
符号付き整数の場合、32 ビットのうちの最初の 31 ビットが整数の値を表すために使用されます。ビット 32 は値の符号を表します。0 は正の数を表し、1 は負の数を表します。符号を表すこのビットは符号ビットと呼ばれ、符号ビットの値によって他のビットの形式が決まります。正の数が純粋なバイナリ形式で格納される場合、31 ビットのそれぞれは 2 の累乗を表します。最初のビット (ビット 0 と呼ばれる) は 20 を表し、2 番目のビットは 21 を表します。未使用のビットは 0 で表され、無視されます。たとえば、値 18 のバイナリ表現は 0000 0000 0000 0000 0000 0000 0001 0010、より簡潔には 10010 です。これらは 5 つの有効ビットであり、これらの 5 ビットだけで実際の値が決まります。
負の数値もバイナリコードで保存されますが、使用される形式は 2 の補数です。値の 2 の補数を計算するには、次の 3 つの手順を実行する必要があります:
(1) この値の絶対値のバイナリ コードを見つけます (たとえば、-18 の 2 の補数が必要な場合は、最初に18) のバイナリ コードを見つけます。
( 2) バイナリの補数を見つけます。つまり、0 を 1 に置き換え、1 を 0 に置き換えます。
このようにして、-18 の 2 進表現、つまり 1111 1111 1111 1111 1111 1111 1110 1110 が得られます。
......ECMAScript では、ビット演算子が値に適用されると、次の変換プロセスがバックグラウンドで発生します。64 ビット値が 32 ビット値に変換され、その後ビット演算が実行され、最後に、32 ビット値が 32 ビット値に変換され、結果は 64 ビット値に戻されます。このようにすると、他の言語でバイナリ演算が同様の方法で実行されるのと同じように、32 ビット値を演算しているように見えます。ただし、この変換プロセスは重大な副作用も引き起こします。つまり、特別な NaN 値と Infinity 値にビット演算を適用すると、これら 2 つの値が 0 として扱われることになります。
ビット演算子が数値以外の値に適用される場合、Number() 関数を使用して値が数値に変換され (自動的に完了)、ビット演算が適用されます。結果は数値になります。 ...... (「Javascript Advanced Programming」から抜粋)
2. "&" (ビット単位の AND):
ビット単位の AND 演算子は、2 つの演算子を持つアンパサンド文字 (&) で表されます。基本的に、ビット単位の AND 演算は、2 つの値の各ビットを位置合わせし、同じ位置にある 2 つの数値に対して AND 演算を実行します。
ビットごとの AND 演算ルール: 両方の値の対応するビットが 1 の場合にのみ 1 が返されます。いずれかのビットが 0 の場合、結果は 0 になります。
これまで理論的なことを話しすぎましたが、理論はとても必要だと思います。次に、例を直接分析してみましょう。
まず、上記の質問の num1、num2、num3、および num6 を見てみましょう。上記の理論を組み合わせて、最終結果が出力される理由を分析してみます。
// num1是1和0进行“按位与”操作后的返回值。1的二进制码简写为1,0的二进制码简写为0,根据上面的规则,第二个操作符数为0,结果是0 var num1 = 1 & 0; console.log(num1); // 0 // 第一个操作符数是字符串,按照前言里面的理论,对于非数值的操作符数,先使用Number()函数处理,结果返回NaN,NaN又会被当成0来处理。所以最终结果也是0 var num2 = 'string' & 1; console.log(num2); // 0 // true是布尔类型值,同样使用Number()函数处理,处理后得到数值1,于是表达式就相当于“1 & 1” 进行位运算,当两个数值都为1的时候,结果返回1 var num3 = true & 1; console.log(num3); // 1 // 23的二进制码是:...10111,5的二进制码是:...00101。然后每一位进行对齐处理,结合上面的规则,可以得出10111&00101的结果是:00101。00101就是5 var num6 = 23 & 5; console.log(num6); // 5 // 再加个例子:24的二进制码为...11000,7的二进制码为...00111,相同位置的两个数执行AND操作,结果发现结果是...00000。所以最终结果是0,你算对了吗? var add1 = 24 & 7; console.log(add1); // 0
3. "|" (ビット単位の OR):
ビット単位の OR 演算子は縦棒記号 (|) で表され、2 つの演算子番号もあります。基本的に、ビットごとの OR 演算も 2 つの値の各ビットを整列させ、同じ位置にある 2 つの数値に対して OR 演算を実行します。
ビットごとの OR 演算規則: 2 つの値の対応するビットのいずれかが 1 である限り 1 が返され、両方のビットが 0 の場合にのみ 0 が返されます。
上記の例を見てみましょう!
// 第一个操作符数为undefined,第二个操作符数是false,均不是数值,所以都要先使用Number()函数处理,处理结果都是返回NaN,NaN又会被当成0处理,于是最终结果是0 var num4 = undefined | false; console.log(num4); // 0 // 第一个操作符数相当于0,第二个操作符数相当于1,结合按位或的规则,最终结果是1 var num5 = undefined | true; console.log(num5); // 1 // 23的二进制码是:...10111,5的二进制码是:...00101。然后每一位进行对齐处理,结合上面的规则,可以得出10111|00101的结果是:10111。10111就是23 var num7 = 23 | 5; console.log(num7); // 23 // 再加个例子:24的二进制码为...11000,7的二进制码为...00111,相同位置的两个数执行AND操作,结果发现结果是...11111。所以最终结果是31,你算对了吗? var add2 = 24 | 7; console.log(add2); // 31
4. その他:
数値を標準のバイナリコードに変換する方法を知らない友達もいると思います。それで、簡単な方法はありますか?答えは「はい」です。
インターネット上で数値から 10 進数への変換を行うオンライン変換ツールのアドレスを偶然見つけました (クリックして表示します)。 (もちろん、見つけた他のツールを使用することもできます。いずれにせよ、効果を達成することが私たちの最終目標です)
最後に、バイナリを手書きで変換するプロセスでまとめた通常のチャートを添付します。数値をバイナリコードに変換するとオシャレ感たっぷり!
JavaScriptの「&」と「|」について詳しくは、PHPの中国語サイトをご覧ください。