Arduino日本語リファレンス



 int a = 5;        // 二進数の 0000000000000101
 int b = a << 3;   // 二進数の 0000000000101000 (十進数の40)
 int c = b >> 3;   // 二進数の 0000000000000101 (最初の値に戻った)

xをyビット分、左シフトするとき(x << y)、左寄りのyビット分は失われます。

 int a = 5;        // 二進数の 0000000000000101
 int b = a << 14;  // 二進数の 0100000000000000 (1が捨てられた)

左シフトは、シフトする回数分、値を2倍していると考えると覚えやすいでしょう。次の例は2のn乗を表しています。

 1 <<  0  ==    1
 1 <<  1  ==    2
 1 <<  2  ==    4
 1 <<  3  ==    8
 ...
 1 <<  8  ==  256
 1 <<  9  ==  512
 1 << 10  == 1024
 ...

最上位ビットが1のxを右シフトするとき、結果はxの型に依存します。xがint型ならば最上位ビットは符号ビットですが、深遠な歴史的経緯に基づき、その符号ビットが右側にコピーされていきます。

 int x = -16;     // 二進数の 1111111111110000
 int y = x >> 3;  // 二進数の 1111111111111110

この符号拡張と呼ばれる挙動をあなたが望まず、かわりに、左から0がシフトして来るほうがいいと思うかもしれません。符号無し整数に対する右シフトではルールが異なります。型キャストを使うことで、符号拡張を取り消すことができます。

 int x = -16;                   // 二進数の 1111111111110000
 int y = (unsigned int)x >> 3;  // 二進数の 0001111111111110

注意深く符号拡張を無効にすることで、右シフトを2をn乗した数での割り算に使うことができます。

 int x = 1000;
 int y = x >> 3;   // 1000を8(2の3乗)で割っている。y=125となる



[目次へ戻る]

Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください [ドキュメント一覧]