[解決済み] ビット演算子とは何ですか?
質問
私は趣味でコードを書いている人間で、学術的あるいは専門的なセッティングでコードを掘り下げたことがないので、これらのビット演算子のようなものは本当に理解できないのです。
私は JavaScript についての記事を読んでいて、どうやらビット演算をサポートしているようです。この演算がところどころで言及されているのをずっと見てきて、それが正確に何であるかを理解するために読んでみましたが、まったく理解できないようです。だから、彼らは何ですか?明確な例があれば最高です! :D
ビット演算の実用的なアプリケーションにはどのようなものがありますか?どのような場合に使用するのでしょうか?
どのように解決するのですか?
なぜこれが有用なのか、誰もその話題に触れていませんので。
私はフラグを扱うとき、ビット演算をよく使います。 たとえば、一連のフラグをある操作に渡したい場合(たとえば
File.Open()
というように、読み込みモードと書き込みモードの両方が有効になっている場合)、それらを1つの値として渡すことができます。 これは、ビットセット(byte、short、int、long)内のそれぞれのビットにフラグの可能性を割り当てることで実現される。 たとえば
Read: 00000001
Write: 00000010
つまり、読み込みと書き込みの両方を渡したい場合は、(READ | WRITE)を渡すと、この2つが組み合わされて
00000011
というように、相手側で復号化することができます。
if ((flag & Read) != 0) { //...
をチェックする
00000011 &
00000001
を返します。
00000001
は0ではないので、このフラグはREADを指定しています。
XORを使って様々なビットをトグルさせることができます。 私は、フラグを使って方向入力(Up, Down, Left, Right)を指定するときに、これを使用しました。 例えば、スプライトが水平方向に動いていて、それを旋回させたい場合です。
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
現在の値と(LEFT | RIGHT)をXORするだけで、この場合、LEFTはオフ、RIGHTはオンになりますね。
ビットシフトはいくつかのケースで有用です。
x << y
と同じです。
x * 2 y
は、2の累乗を素早く掛ける必要がある場合に使用しますが、先頭ビットに1ビットをシフトすることに注意してください。 また、異なるサイズのデータを扱う場合にも便利です。 例えば、4バイトから整数を読み取る場合などです。
int val = (A << 24) | (B << 16) | (C << 8) | D;
Aが最上位バイト、Dが最下位バイトと仮定します。 という結末になる。
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
色はしばしばこの方法で保存されます(最上位バイトは無視されるか、アルファとして使用されます)。
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
再び値を求めるには、一番下にくるまでビットを右にずらし、残りの高次ビットをマスクすればよい。
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
と同じです。
11111111
. つまり、本来はRedの場合、こうなるわけです。
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] JavaScriptの変数のスコープとは何ですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] 3つのブール値のうち、少なくとも2つが真であるかどうかをチェックする
-
[解決済み】JavaScript版sleep()とは?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
JSアレイループと効率解析の比較
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
vueが定義するプライベートフィルタと基本的な使い方
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
JavaScriptのStringに関する共通メソッド
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules