ビット操作

8596 ワード


ビットを得る
このメソッドは、関連するビットをゼロの位置にシフトします.次に、0001のようなビットパターンを持つものを実行し、操作します.これは、関連するものを除いて、元の番号からすべてのビットをクリアします.関連ビットが1の場合、結果は1である.

セットビット
このメソッドはビットポジションビットで1をシフトし、00100のような値を作成します.次に、特定のビットを1に設定しますが、他のビット数には影響しません.

クリアビット
このメソッドはビットポジションビットで1をシフトし、00100のような値を作成します.それが11011のように見える数を得るためにこのマスクを逆にするより.そして、その数とマスクの両方に対して演算を行う.この操作はビットを解除する.

更新ビット
このメソッドは“クリアビット”と“セットビット”メソッドの組み合わせです.

アイセブン
このメソッドは、指定された数が偶数かどうかを判断します.奇数は最後の右ビットを1にセットすることに基づいている.
Number: 5 = 0b0101
isEven: false

Number: 4 = 0b0100
isEven: true

イプシティブな
このメソッドは、数値が肯定的かどうかを判断します.すべての正の数が0にセットされるという事実に基づいています.しかし、提供される数がゼロかマイナスゼロであるならば、それはまだfalseを返します.
Number: 1 = 0b0001
isPositive: true

Number: -1 = -0b0001
isPositive: false

2つ掛ける
このメソッドは元の番号を1ビット左シフトします.このように、すべてのバイナリ番号構成要素(2つの力)は2によって掛け算しています、そして、このように、ナンバー自体は2によって掛けられています.
Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0

After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0

二分する
このメソッドは元の番号を1ビット右シフトします.このように、すべてのバイナリ番号構成要素(2つの力)は2によって分けられています、そして、このように、ナンバー自体は残りなしで2によって分けられています.
Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0

After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0

スイッチ記号
このメソッドは正の数を負と後方にします.それを行うには、“twos補数”のアプローチを使用して、すべてのビットの反転と1を追加することによってそれを行う.
1101 -3
1110 -2
1111 -1
0000  0
0001  1
0010  2
0011  3

2つの符号付き数字を掛ける
このメソッドは2つの符号付き整数を乗算します.このメソッドは次の事実に基づいています.
a * b can be written in the below formats:
  0                     if a is zero or b is zero or both a and b are zeroes
  2a * (b/2)            if b is even
  2a * (b - 1)/2 + a    if b is odd and positive
  2a * (b + 1)/2 - a    if b is odd and negative
このアプローチの利点は、各再帰ステップでオペランドの1つが元の値の半分に減少するということである.したがって、実行時間の複雑さはO(log(b))であり、Bは各再帰ステップ上の半分に減少するオペランドである.

参考文献
https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/bits