サーチ…


ビット演算子

ビット単位の演算子は、データのビット値に対する演算を実行します。これらの演算子は、オペランドを2の補数で符号付き32ビット整数に変換します。

32ビット整数への変換

32ビット以上の数値は最上位ビットを破棄します。たとえば、32ビットを超える次の整数は32ビット整数に変換されます。

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

2の補数

通常のバイナリでは、2の累乗としての位置に基づいて1加算することによってバイナリ値を見つけます。右端のビットは2^0で、左端のビットは2^n-1nはビットの数です)。たとえば、4ビットを使用します。

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

2つの補数の形式は、数値の負の対応(6対6)が反転された数に加えて1のビットであることを意味します。 6の反転ビットは次のようになります。

// Normal binary
   0 1 1 0
// One's complement (all bits inverted)
   1 0 0 1  => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
   1 0 1 0  => -8 + 0 + 2 + 0 => -6

注:詳細追加1進数の左にある年代は、2の補数でその値を変更しません。値10101111111111010は両方とも-6です。

ビット単位AND

ビット単位のAND演算a & bは、バイナリ値を1で返します。バイナリオペランドの両方が特定の位置に1持ち、他のすべての位置で0を返します。例えば:

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

現実世界の例:Numberのパリティチェック

この「傑作」の代わりに(残念なことに、多くの実際のコード部分ではあまりにも頻繁に見られる):

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

(整数)番号のパリティをはるかに効果的かつ簡単にチェックすることができます:

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

ビット単位OR

ビットごとのOR演算a | bでバイナリ値を返す1オペランド又は両方のオペランドのいずれかが有する1特定位置で」Sを、そして0両方の値が持っているとき0位置に。例えば:

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

ビット単位NOT

ビットごとのNOT演算は、 ~a与えられた値のビット反転しますaこれは、すべての10になり、すべての01になることを意味します。

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

ビット単位XOR

ビットごとのXOR( 排他的論理和)演算a ^ bは、2つのビットが異なる場合にのみ1置きます。排他的またはいずれか一方を意味するが、両方を意味するものではない

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

実世界の例:追加のメモリ割り当てをせずに2つの整数値を交換する

var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11

シフト演算子

ビット単位のシフトは、ビットを左右に「移動」させ、それによって操作されるデータの値を変更するものと考えることができる。

左方移動

左シフト演算子(value) << (shift amount)は、ビットを(shift amount)ビット(shift amount)左に(shift amount)ます。右から来る新しいビットは0なります:

5 << 2 => 20
//  5:      0..000101
// 20:      0..010100 <= adds two 0's to the right

右シフト( 符号伝播

右シフト演算子(value) >> (shift amount)は、初期のオペランドの符号を保持するため、「符号伝播右シフト」とも呼ばれます。右シフト演算は、シフトvalue指定されたshift amount右にビットを。右からシフトされた余分なビットは破棄されます。左から来る新しいビットは、最初のオペランドの符号に基づいています。一番左のビットが1場合、新しいビットはすべて1なり、その逆は0ます。

20 >> 2 => 5
// 20:      0..010100
//  5:      0..000101 <= added two 0's from the left and chopped off 00 from the right

-5 >> 3 => -1
// -5:      1..111011
// -2:      1..111111 <= added three 1's from the left and chopped off 011 from the right

右シフト( ゼロフィル

ゼロ充填右シフト演算子(value) >>> (shift amount)はビットを右に移動し、新しいビットは0なります。 0は左からシフトインされ、右の余分なビットはシフトアウトされて破棄されます。つまり、負の数を正の数にすることができます。

-30 >>> 2 => 1073741816
//       -30:      111..1100010
//1073741816:      001..1111000

Zero-fill right shiftとsign-propagating right shiftは、負でない数値に対しても同じ結果を返します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow