<<、>>


目次に戻る


今日はビット演算の左シフトを行う << と右シフトを行う >> を紹介します。シフト演算 はコンピュータ向けの演算で、コンピュータから離れた普段の生活ではまずお目にかかる ことが無いので、軽くどのようなものかを説明します。
 
シフト演算を学ぶにはまず「コンピュータはデータを0と1の2進数で取り扱っている」 という事を覚えおく必要があります。
例:
10進数 2進数
1    1
2    10
3    11
    :
    :
15   1111
16   10000
シフト演算は10進数で理解しようとすると2倍、1/2倍しているだけのように見えるので すが、2進数で表すと視覚的に面白い物があります。
シフト演算の例:
10進数           2進数の場合
5  << 1 == 10  101  << 1 == 1010
13 << 2 == 52  1101 << 2 == 110100
5  >> 1 == 2   101  >> 1 == 10
13 >> 2 == 3   1101 >> 2 == 11
 
では、このシフト演算はどういった場面で使うのか。はっきり言って、普通の人は使 わないです。が、次のような場面で多く利用されます。
  1. 使用できるメモリの量が少ないため1ビットたりとも無駄にしたくない。
  2. データの圧縮を行いたいので、ビット単位のデータ管理をしたい。
  3. 変数のデータを2の累乗倍(2倍、4倍、8倍)にしたり、2の累乗倍で割りたい(1/2倍、1 /4倍、1/8倍)時にシフト演算を使うと高速になる場合がある。


シフト演算を使うときに注意する事があります。それは、シフトする変数が signed か unsigned かでシフトの結果が変わる場合があるということです。これは、 signed の変数をシフトするときは算術シフトが、unsigned の変数をシフトするときは論理シフトが 用いられる為起こります。
int main(int argc, char* argv[])
{
    unsigned int a = 0xf0ffffff; /* 処理系によって桁が異なる。 sizeof(int)=2byteの時は 0xf0ff で行う*/
    int b = (int)(b);

    printf("a = %08x , b = %08x\n",a,b);
    a >>= 4;
    b >>= 4;
    printf("a = %08x , b = %08x\n",a,b);
    a <<= 8;
    b <<= 8;
    printf("a = %08x , b = %08x\n",a,b);
    return 0;
}

なぜこういうことを起こす必要があるのか。それは来週までのお楽しみ。


目次に戻る