Javascriptで見たことの無い記述を見ると楽しくなってくる、ユゲタです。
先日、javascriptで面白い処理をしているライブラリの中身を読んでいた時に、
a = a|0</code
こんな記述で書かれているのがあり、疑問に思ったので調べてみる事にした。
そもそも、let a = a||0と書くと、aの値がfalse,null,undefined,NaN,0などif文でfalse判定がされる場合に、aに0を代入するという意味になるんですが、a|0だとどうなるんだ?
やはり思ったとおりビット演算子という事が分かったので、この記述に見覚えのない人の為に、ちょっとだけ解説をしてみたいと思います。
ビット演算子とは?
プログラミングを仕事でやっている友達に「Javascriptでバイナリ処理して画像データや特殊ファイルを独自にコンバートしている」と話すと、大概、変態扱いされてしまいます。
スクリプト言語以外の言語(c言語とか)からプログラミングを始めた人は、バイナリ操作に対して抵抗が無いと思いますが、
javascriptを始めとするwebエンジニア領域のプログラミングの多くがバイナリデータを操作することがほぼありません。
演算子はみんな知っていると思いますが、+とか-の計算をする記号の事で、演算は計算する事です。
ビット演算子というは、2進数の計算をする処理だと思ってください。
2進数の計算では、1 + 1 は 11 になるというのはわかりますか?
これを4bitの器で書くと
0001 + 0001 => 0011
こんな感じになります。
2ビットでは0と1しか存在しないので、アラビア数字の2が無いんですね。
コンピュータが0と1で成り立っているというのは、コンピュータ内部がこのビット演算で成り立っているからなんですね。
ビット演算問題
では、次のような問題の答えはどうなるか考えてみましょう。
問題1.
0101 + 1010
問題2.
1100 + 0011
問題3.
1111 + 0001
そんなに難しくないですが、答えは、このブログの最後に書いておきます。
javascriptで便利に使えるビット演算子
小数切り捨て
a | 0
これ、小数点切り捨ての意味だったんですね。
でも、もっとカンタンな記述をユゲタは知っています。
~~a
これで、1.11が1の整数になります。
割り算
100 >> 1
この答えは、50が返り、
100 >> 2
これは、25が返ってきます。
左の値を右の値の0スタートのべき乗値で割るイメージですね。
ようするに、
100 >> 1は、100÷2で
100 >> 2は、100÷4なのです。
普通に100/2とか書いたほうが圧倒的にわかりやすいんですが、たまにビット演算で記述する人がいるので、ビビらず読み解けるようにしておくといいでしょう。
値が入っているか判定
冒頭説明した、
a = a||0
aがconst定義されていない時に、aに値がfalse判定されれば、0を代入するというaが数値型の場合はこれでいいんですが、
0以外の値を入れようとする時に、この記述ではトラブルになります。
その場合は、
a = a??0
このように書くと、aがnullまたはundefinedの時だけ、??の右側の値が代入されるようになります。
特性を覚えて使いましょう。
その他のヒント
ビット演算は、記号を組み合わせる事が多いので、&や|や^~などを組み合わせて色々な演算になるケースが多いので、リファレンスサイトで調べてみてもいいし、人の書くコードを見て、見たこと無い記号に出会ったら、学習チャンスです。
ビット演算問題の答え
問題1の答え.
0101 + 1010 => 1111
問題2の答え.
1100 + 0011 => 1111
問題3の答え.
1111 + 0001 => 10000
0 件のコメント:
コメントを投稿