1を左シフトした時の10進数と16進数の対応表

だいたいの値をいつも忘れるのでメモ代わりに対応表を作ってみた。

| 1 <<  0 |          1 | 0x00000001 |
| 1 <<  1 |          2 | 0x00000002 |
| 1 <<  2 |          4 | 0x00000004 |
| 1 <<  3 |          8 | 0x00000008 |
| 1 <<  4 |         16 | 0x00000010 |
| 1 <<  5 |         32 | 0x00000020 |
| 1 <<  6 |         64 | 0x00000040 |
| 1 <<  7 |        128 | 0x00000080 |
| 1 <<  8 |        256 | 0x00000100 |
| 1 <<  9 |        512 | 0x00000200 |
| 1 << 10 |       1024 | 0x00000400 |
| 1 << 11 |       2048 | 0x00000800 |
| 1 << 12 |       4096 | 0x00001000 |
| 1 << 13 |       8192 | 0x00002000 |
| 1 << 14 |      16384 | 0x00004000 |
| 1 << 15 |      32768 | 0x00008000 |
| 1 << 16 |      65536 | 0x00010000 |
| 1 << 17 |     131072 | 0x00020000 |
| 1 << 18 |     262144 | 0x00040000 |
| 1 << 19 |     524288 | 0x00080000 |
| 1 << 20 |    1048576 | 0x00100000 |
| 1 << 21 |    2097152 | 0x00200000 |
| 1 << 22 |    4194304 | 0x00400000 |
| 1 << 23 |    8388608 | 0x00800000 |
| 1 << 24 |   16777216 | 0x01000000 |
| 1 << 25 |   33554432 | 0x02000000 |
| 1 << 26 |   67108864 | 0x04000000 |
| 1 << 27 |  134217728 | 0x08000000 |
| 1 << 28 |  268435456 | 0x10000000 |
| 1 << 29 |  536870912 | 0x20000000 |
| 1 << 30 | 1073741824 | 0x40000000 |
| 1 << 31 | 2147483648 | 0x80000000 |

16進数は1と2と4と8の繰り返しで大きくなっていくんですね、初めて知った。

ちなみにこの対応表はC++で作成しました。以下がそのコードになります。

#include <sstream>
#include <iostream>

int main() {
    std::ostringstream s;
    
    for (int i=0;i<32;++i) {
        unsigned int j = (1<<i);
        
        s << "| 1 << ";
        s.flags(std::ios::dec);
        s.width(2);
        s.fill(' ');
        s << i << " | ";
        
        s.flags(std::ios::dec);
        s.width(10);
        s << j << " | 0x";
        
        s.flags(std::ios::hex);
        s.width(8);
        s.fill('0');
        s << j << " | \n";
    }
    
    std::cout << s.str() << std::endl;
}

ostringstreamを使ってフォーマット指定してみたんだけど、これが非常に醜い。コードも無駄に長いし素直にsprintf使った方がいいんじゃないのか、これ。

ってことで前にコメントでboost::formatというのがあると教えてもらったので書き直してみた。

#include <iostream>
#include "boost/format.hpp"

int main () {
    for (int i=0;i<32;++i) {
        unsigned int j = (1<<i);
        std::cout << boost::format("| 1 << %2d | %10u | 0x%08x |") % i % j % j << std::endl;
    }
}

うん。凄くわかりやすい。断然こっちのが良い。

しかし今回初めてboostを使ってみたのだけれど、コンパイルにずんげー時間かかるね。それだけ複雑で巨大なんだろうな・・・。

ってことでやっぱり無難にsprintfが一番良いのかもしれない。