【JavaScript】JSの論理ビット演算子とシフト演算子

3058 ワード

先日、あるブラシのサイトで題解を見ました.作者はシフト演算+論理ビット演算を使っています.その時見たのはちょっとばかばかしくて、シフト演算は知っています.
論理演算がちょっと分かりませんので、わざわざ調べてみました. を総称して呼ぶことができる. では、論理ビット演算子は4つあり、シフト演算子は3つあります.
番号付け
クラス
演算子
名前
1
論理演算子&ビットと
2
論理演算子
記号が出ない
ビット
3
論理演算子^位が違う
4
論理演算子~非ビット
5
シフト演算子<<符号なし左シフト
6
シフト演算子>>符号付き右シフト
7
シフト演算子>>>符号なし右シフト
論理演算子
1.&ビットと演算子
//      ,     
// 0 & 0 = 0
// 0 & 1 = 0
// 1 & 1 = 1

console.log(7 & 4);// 4

//   :
// 7 = ...0111B
// 4 = ...0100B
// ------------
// 4 = ...0100B
2.|ビットまたは演算子
//      ,     
// 0 | 0 = 0
// 0 | 1 = 1
// 1 | 1 = 1

console.log(7 | 4);// 7

//   :
// 7 = ...0111B
// 4 = ...0100B
// ------------
// 7 = ...0111B
3.^ビット異形または演算子
//              
// 0 ^ 0 = 0
// 0 ^ 1 = 1
// 1 ^ 1 = 0

console.log(7 ^ 4);// 3

//   :
// 7 = ...0111B
// 4 = ...0100B
// ------------
// 3 = ...0011B
4.~ビットの非演算子
JSは10進数を32桁のバイナリ数に変換します.上のは4桁だけ、4桁までは全部0です.
以上のいずれの演算も0および0で演算された結果は0であるので、前のカットは最終結果に影響を及ぼさない.
見えます~5の演算結果は1111 1111 1111 1111 1111 1111 1111 1010、符号ビットがある演算結果は全部補数ですので、結果は-((1 * 4) + (1 * 1)) - 1 = -6
//       

console.log(~5);// -6

//   :
// 0000 0000 0000 0000 0000 0000 0000 0101  = 5
// ----------------------------------------
// 1111 1111 1111 1111 1111 1111 1111 1010  = -6   
シフト演算子
5.<<符号なし左シフト演算子
//       ,   0  
console.log(10 << 2);// 40
console.log(-10 << 2);// -40

//   :
// 1.  
//         10 + 10 = 20
//       20 + 20 = 40,    ,        -10 << 2 = -40
// 2.  (      )
// ...001010B << 2
// ----------------
// ...101000B = 40
6.>>シンボル右シフト演算子があります.
//       ,      0  ,      1  
console.log(10 >> 2);// 2

//   :(      )
// ...001010B >> 2
// ----------------
// ...000010B = 2

console.log(-10 >> 2);// -3
//   :(      )
// ...110101B >> 2
// ----------------
// ...111101B = -2 - 1 = -3
7.>>>符号なし右シフト演算子
符号なしで右シフト演算子ビットを移動すると符号を無視し、上位はすべて0で補完されます.
//       ,   0  
console.log(10 >>> 2);// 2

//   :(      )
// ...001010B >>> 2
// ----------------
// ...000010B = 2

console.log(-10 >>> 2);// 1073741821
//   :(      )
// 1111 1111 1111 1111 1111 1111 1111 0101 >>> 2
// ---------------------------------------
// 0011 1111 1111 1111 1111 1111 1111 1101 = 1073741821
【アプレット】アプレット学習で発生した問題のまとめ(一) 【JavaScript】JSではどのように多次元配列(行列)を重くするか?