Arduinoリファレンス

Arduinoリファレンスの日本語訳のページです
garretlab
ビット単位のシフト演算子

名称

ビット単位のシフト演算子(<<と>>)

説明

PlaygroundのBitmathチュートリアルから。

C++言語におけるビット単位のシフト演算子には、左シフト演算子(<<)と右シフト演算子(>>)の2種類がある。これらの演算子は、左オペランドのビットを、右オペランドで指定した数だけ、左または右にシフトさせる。

書式

variable << number_of_bits

variable >> number_of_bits

引数

varable 整数(byte, int, long)
number_of_bits 32以下の整数

使用例

    int a = 5;        // binary: 0000000000000101
    int b = a << 3;   // binary: 0000000000101000, or 40 in decimal
    int c = b >> 3;   // binary: 0000000000000101, or back to 5 like we started with

xをyビット左にシフトすると(x << y)、元のxの左側のyビットはなくなる。

    int a = 5;        // binary: 0000000000000101
    int b = a << 14;  // binary: 0100000000000000 - the first 1 in 101 was discarded

シフトしてもどのビットも失われないといことが確実な場合、ビット単位の左シフト演算子は、左オペランドを2の右オペランド乗すると考えるのが簡単である。以下の例は、2のべき乗を生成する。

    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が負の値かそうでないかを決めると先に説明した。この場合は、歴史的な理由により、符号ビットが右ビットにコピーされる。

    int x = -16;     // binary: 1111111111110000
    int y = x >> 3;  // binary: 1111111111111110

符号拡張と呼ばれるこの振る舞いは、望まない振舞いであることも多い。そうではなく、0が左からシフトしてほしいこともあるだろう。unsigned int型の式に対する右シフトの振舞いは異なるので、キャスト演算を使うことで1がコピーされるのを防ぐことができる。

    int x = -16;                   // binary: 1111111111110000
    int y = (unsigned int)x >> 3;  // binary: 0001111111111110

注意深く符号拡張を避けることができるのであれば、ビット単位の右シフト演算子は2のべき乗で割るときに利用できる。

    int x = 1000;
    int y = x >> 3;   // integer division of 1000 by 8, causing y = 125.

バージョン

Arduino 1.8.5

オリジナルのページ

https://www.arduino.cc/en/Reference/Bitshift



メニューを表示するためにJavaScriptを有効にしてください。

inserted by FC2 system