ビットシフト演算子
<<, >>:ビットシフト演算子
C ++には、左シフト演算子<<と右シフト演算子>>という2つのビットシフト演算子があります。 これらの演算子は、左オペランドのビットを、右オペランドによって指定された位置の数だけ左または右にシフトさせます。
構文
code:記述形式
some_int << number_of_bits
some_int >> number_of_bits
引数
some_int :整数値または変数
number_of_bits :整数値の最大値は8 x sizeof(variable)
(number_of_bitsはint型で最大32、char型では最大8です。さまざまな整数サイズがこの構文に要約されています)
利用例
ビットシフトのいくつかの例を、コメント内の数値のバイナリ表現で示します。
code:sample1.ino
int a = 5; // binary: 101
int b = a << 3; // binary: 101000, or 40 in decimal
int c = b >> 3; // binary: 101, or back to 5 like we started with
値xをyビット(x << y)だけシフトしたとき、xの左端のyビットは失われ、文字通り存在しなくなりました。 char値(0〜255の範囲の整数で、8ビットのメモリを占有する)でこの例を実行します。
code:sample2.ino
char a = 5; // binary (all 8 bits): 00000101
char b = a << 7; // binary: 10000000 - the first 1 in 101 was discarded
ある値の中のどれもが忘却にシフトされていないことが確かであれば、左シフト演算子を考える簡単な方法は、左のオペランドに2を乗算して右の演算数に掛けることです(数式表記ではx << yはxのビットのどれもシフトアウトされない限り、x * 2yに等しい)。 例えば、2の累乗を生成するために、以下の式を用いることができる。
code:sample3.ino
1 << 0 == 1
1 << 1 == 2
1 << 2 == 4
1 << 3 == 8
...
1 << 8 == 256
1 << 9 == 512
1 << 10 == 1024
...
xをyビット(x >> y)だけ右にシフトし、xの最上位ビットが1の場合、動作はxの正確なデータ型に依存します。 xがint型である場合、最上位ビットは特殊であり、xが負であるかどうかを判定します。 詳細はここで説明するには複雑すぎますが、2の補数演算に関するWikipediaの記事で完全に説明されています。これはほとんどのコンピュータが整数を格納するシステムです。 その場合、秘密の歴史上の理由から、符号ビットは下位ビットにコピーされます。
code:sample4.ino
int x = -16; // binary (all 32 bits): 11111111111111111111111111110000
int y = x >> 3; // binary: 11111111111111111111111111111110
この動作は、「符号拡張」と呼ばれ、しばしばあなたが望むものではありません。 あなたはおそらくゼロが左からシフトされることを望みます。 右シフトルールは符号なしのint値では異なるので、型キャストを使用して左からコピーされるものを抑制することができます。
code:sample5.ino
int x = -16; // binary: 11111111111111111111111111110000
int y = (unsigned int)x >> 3; // binary: 00011111111111111111111111111110
符号拡張を行わないように注意する場合は、2の累乗で除算する方法として、右シフト演算子>>を使用できます。たとえば、次のようにします。
code:sample6.ino
int x = 1000;
int y = x >> 3; // integer division of 1000 by 8, causing y = 125.
Arduinoの互換性
これはC ++言語の一部であるため、Maple(Arduino STM32)のビットシフトはArduinoと互換性があります。
ただし、Maple(Arduino STM32)にはArduinoよりも大きな整数型(より多くのビット数)があることに注意してください。
STM32は32ビットプロセッサであるため、int型はArduinoの16ビットマイクロコントローラのように16ビットではなく32ビットを占めます。 これは、x << yのように左にシフトすることができることを意味します。
Maple(Arduino STM32)上の整数型のビット数を計算するには、1バイトに8ビットがあるため、バイト数(これらの表を参照)に8を掛けます。 例えば、short型は2バイトのメモリ、すなわち2 * 8 = 16ビットを占有します。
関連事項
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。