【JavaScript】JSの論理ビット演算子とシフト演算子
3058 ワード
先日、あるブラシのサイトで題解を見ました.作者はシフト演算+論理ビット演算を使っています.その時見たのはちょっとばかばかしくて、シフト演算は知っています.
論理演算がちょっと分かりませんので、わざわざ調べてみました.
番号付け
クラス
演算子
名前
1
論理演算子
2
論理演算子
記号が出ない
ビット
3
論理演算子
4
論理演算子
5
シフト演算子
6
シフト演算子
7
シフト演算子
論理演算子
1.
JSは10進数を32桁のバイナリ数に変換します.上のは4桁だけ、4桁までは全部0です.
以上のいずれの演算も
見えます
5.
符号なしで右シフト演算子ビットを移動すると符号を無視し、上位はすべて0で補完されます.
論理演算がちょっと分かりませんので、わざわざ調べてみました.
と
を総称して呼ぶことができる.
では、論理ビット演算子は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ではどのように多次元配列(行列)を重くするか?