Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

>>演算子と>>>演算子の違い

JavaScriptでのビット演算はほとんど使われてないと思います。そして多分>>>を知らないという人もいるのではないでしょうか。今回はそんなマイナーな>>>演算子にスポットを当てたいと思います。

>>演算子の動作

>>演算子、>>>演算子共に右ビットシフトを行います。ただし、まず>>演算子は受け取った数値を32ビットの整数に落とし込みます。JavaScriptでは整数も小数もごちゃ混ぜにされてますが、>>演算の結果返ってくるのは32ビット整数です。小数以下は切り捨てられてしまいます(これを利用して高速に小数切り捨てする人もいますが)。

この32ビット整数が曲者です。実は32ビット整数と一口に言っても符号付き、符号なしの2種類あります。符号というのはプラスマイナスのことで符号なしでは正の整数しか扱えません。しかしその分符号付きより1ビット多く扱えるので表現力が2倍です。

そしてさっき言及しなかった理由がここにあります。>>演算子は符号付き整数を、>>演算子は符号なし整数を返します。より正確に言うと>>演算子は符号を維持します。左端のビットで詰めていくので符号が変わらないというわけです。>>>演算子は逆に左から0を詰めていきます。

>>と>>>の違い

なぜ2つもあるのか、それは恐らくビットシフトが割り算に使えるからです。1ビット右にシフトすると÷2して小数以下切り捨てた結果と一致します。ただ単に2で割ってるだけなのに符号が変わるのは都合が悪いですよね。だから符号を維持する>>演算子が存在しているのだと思われます。

ビットマスクなど左端から0を詰めてほしい時に間違えて>>を使うと予期しない動作をすることがあるのでご注意を。