ホームページ ウェブフロントエンド jsチュートリアル Javascriptの「&」と「|」の詳しい説明

Javascriptの「&」と「|」の詳しい説明

Feb 03, 2017 pm 01:44 PM

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の中国語サイトをご覧ください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:17 PM

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

chart.js:パイ、ドーナツ、バブルチャートを始めます chart.js:パイ、ドーナツ、バブルチャートを始めます Mar 15, 2025 am 09:19 AM

このチュートリアルでは、chart.jsを使用してパイ、リング、およびバブルチャートを作成する方法について説明します。以前は、4つのチャートタイプのchart.js:ラインチャートとバーチャート(チュートリアル2)、およびレーダーチャートと極地域チャート(チュートリアル3)を学びました。 パイとリングチャートを作成します パイチャートとリングチャートは、さまざまな部分に分かれている全体の割合を示すのに理想的です。たとえば、パイチャートを使用して、サファリの男性ライオン、女性ライオン、若いライオンの割合、または異なる候補者が選挙で受け取る票の割合を示すことができます。 パイチャートは、単一のパラメーターまたはデータセットの比較にのみ適しています。パイチャートのファンの角度はデータポイントの数値サイズに依存するため、パイチャートは値のあるエンティティをゼロ値で描画できないことに注意してください。これは、割合がゼロのエンティティを意味します

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles