1. ホーム
  2. javascript

[解決済み] ビット演算子とは何ですか?

2022-06-17 13:45:04

質問

私は趣味でコードを書いている人間で、学術的あるいは専門的なセッティングでコードを掘り下げたことがないので、これらのビット演算子のようなものは本当に理解できないのです。

私は 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)