Javascriptのnum|0は小数点削除の意味

2022年10月10日

Javascript テクノロジー プログラミング

eyecatch 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

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。