メモを揉め

お勉強の覚書。

ビット演算でundefined、NaNを0に変換する

javascriptの算術演算子は(+が文字列連結の時を除いて)被演算子undefinedNaNの時、結果はNaNになります。

 

undefined + 1
//NaN

undefined - 1
//NaN

undefined * 1
//NaN

undefined / 1
//NaN

undefined % 1
//NaN

+undefined
//NaN

-undefined
//NaN


NaN + 1
//NaN

NaN - 1
//NaN

NaN * 1
//NaN

NaN / 1
//NaN

NaN % 1
//NaN

+NaN
//NaN

-NaN
//NaN

ビット演算子の場合、これらが全て0として扱われます。

 

undefined ^ 1
// 0 ^ 1 => 1

undefined & 1
// 0 & 1 => 0

undefined | 1
// 0 | 1 => 1

undefined << 1
// 0 << 1 => 0

undefined >> 1
// 0 >> 1 => 0

undefined >>> 1
// 0 >>> 1 => 0

~undefined
// ~0 => -1


NaN ^ 1
// 0 ^ 1 => 1

NaN & 1
// 0 & 1 => 0

NaN | 1
// 0 | 1 => 1

NaN << 1
// 0 << 1 => 0

NaN >> 1
// 0 >> 1 => 0

NaN >>> 1
// 0 >>> 1 => 0

~NaN
// ~0 => -1

下の例はi35711で割り切れるか否かが1248のビットに対応しています。
割り切れない場合はundefinedになるので+で連結すると、NaNになってしまいます。

 

var i = 35;

[1][i%3] + [2][i%5] + [4][i%7] + [8][i%11]

// undefined + 2 + 4 + undefined => NaN

ビットフラグの合成などは+の代わりに|^が使えます。

 

[1][i%3] | [2][i%5] | [4][i%7] | [8][i%11]

// undefined | 2 | 4 | undefined => 6


[1][i%3] ^ [2][i%5] ^ [4][i%7] ^ [8][i%11]

// undefined ^ 2 ^ 4 ^ undefined => 6

ちなみにnullは算術演算子でも0扱いです、
ちょっとずるいです。

 

null + 1
// 0 + 1 => 1