<< (左シフト) >> (右シフト)原文C++言語には2つのビットシフト演算子があります。<<が左シフト、>>が右シフトです。演算子の右側の数だけ、左側の値をシフトします。 【構文】 値 << ビット数 値 >> ビット数 値は、byte型、int型、long型などの整数 ビット数は32以下の整数です 【例】 3ビットずつ左シフトと右シフトをする例です。 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までお送りください [Arduino wiki]