C/C++ ポインター入門 > 2進数、16進数
Nobuhide Tsuda
Oct-2013
2進数、16進数
- 2進数、16進数なんてよく知ってるぜ、というひとは本章をスキップしてね。
- なぜ10進数ではなく、2進数、16進数を使用するのかと言うと、その方がコンピュータにとって都合がよいからである。
- 慣れてない人にとっては解りづらいとは思うが、相手(コンピュータ)の立場にたって考えるのが肝要である。
- 現在のコンピュータは 0 または 1 のデータを取り扱う。これを「ビット(bit)」と呼ぶ。
- ひとつのビットだけでは、表現できる状態が2つしかない。
- これでは状態数が少なすぎなので、通常は8個のビットをひとまとまりとして取り扱う。
- これを「バイト(byte)」と呼ぶ。
- 1バイトで表現可能な範囲は、2進数で書けば 00000000 から 11111111 まで。
- 10進数で書けば 0 から 255 までとなる。
- 2進数で表記すると桁が多くなりすぎるので、通常は16進数を用いる。
- 0から9までは通常の数を用い、10~15は 'A', 'B', 'C', 'D', 'E', 'F' を用いる。
- 小文字('a', 'b', 'c', 'd', 'e', 'f')で表記してもよい。
- 16進数1桁は4ビットに相当する。
2進数 | 16進数 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
- Nビットの数値を16進数に変換すると、(Nが4の倍数であれば、)N/4桁の16進数で表記できる。
- C/C++ では値が16進数であることを示すために、数値の直前に「0x」(または 0X)を書く。
- 「0x100」は16進数の100のことであり、10進数に変換すると 256 となる。
演習問題
- 10進数の100を、2進数、16進数に変換してみなさい
- 2進数の 01011010 を 10進数、16進数に変換してみなさい
- 32ビットの数値を16進数に変換すると何桁になるか?
- 4桁の16進数を2進数に変換すると何桁になるか?
C/C++ プログラムによる10進数・16進数表示
- C/C++ の printf文で変数の値を10進数表示する場合は %d を使用する。
int x = 100;
printf("x = %d\n", x); // 10進数表記
実行結果:
x = 100
C/C++ の printf文で変数の値を16進数表示する場合は %x を使用する。
int x = 100;
printf("x = 0x%x\n", x); // 16進数表記
実行結果:
x = 0x64
場合によっては、16進数を固定桁数にし、先頭に0を付けたい場合がある。
そんな場合は %0桁数x を使うといいぞ。
int x = 100;
printf("x = 0x%04x\n", x); // 16進数4桁表記
実行結果:
x = 0x0064
C++ の iostream の cout を使って変数の値を10進数表示する場合は << を使用する。
#include <iostream> // for std::cout
.....
int x = 100;
std::cout << "x = " << x << "\n"; // デフォルトは10進数表記
実行結果:
x = 100
C++ の iostream の cout を使って変数の値を16進数表示する場合は、<< std::hex を使用して、16進数モードに切り替える。
#include <iostream> // for std::cout
.....
int x = 100;
std::cout << "x = 0x" << std::hex << x << "\n"; // 16進数表記に切り替え
実行結果:
x = 0x64
※ 一度16進数モードに切り替えると、その後も16進数表示される。
10進数モードに切り替えるには << std::dec を記述する。
cout で桁数を指定するには <iomanip> をインクルードし、std::setw(wd) を使う。
さらに、桁を埋める文字指定には std::setfill(c) を使う。
#include <iostream> // for std::cout
#include <iomanip> // for std::setw, std::setfill>
....
int x = 100;
std::cout << "x = 0x" << std::hex << std::setw(4)
<< std::setfill('0') << x << "\n";
実行結果:
x = 0x0064
正直言って、printf より cout が好きな筆者でもこの表記はめんどくさいと考える。
下記のように、16進数出力のためのマクロを定義しておけばいいのではないだろうか?
#include <iostream> // for std::cout
#include <iomanip> // for std::setw, std::setfill>
#define hexformat(fill, wd) std::hex<<std::setfill(fill)<<std::setw(wd)
....
int x = 100;
std::cout << "x = 0x" << hexformat('0', 4) << x << "\n";
実行結果:
x = 0x0064
上:ポインター入門
|上:C/C++ ポインタ入門
|次:メモリ