検索
ホームページウェブフロントエンド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の中国語サイトをご覧ください。

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

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 中国語版

SublimeText3 中国語版

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

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター