【C++入門】2進数と8進数を相互に変換するプログラムの作り方
2進数と8進数とは
コンピュータシステムでは、2進数は二進法(基数2)で表現され、8進数は八進法(基数8)で表現されます。つまり、2進数は「0」と「1」のみを使う記数法であり、8進数は「0」から「7」までの数字を使う記数法です。
2進数と、それに対応する8進数の例は以下の表の通りです。
| 2進数 | 8進数 |
|---|---|
| 01010 | 12 |
| 00111 | 7 |
| 11001 | 31 |
| 10000 | 20 |
例えば2進数「1011」は、各桁に2の累乗(8+0+2+1)を掛けて足し合わせると10進数の「11」となり、さらにこれを8進数に直すと「13」になります。このような変換を行うC++プログラムを以下に示します。
サンプルプログラム
#include <iostream>
#include <cmath>
using namespace std;
int BinarytoOctal(int binaryNum) {
int octalNum = 0, decimalNum = 0, count = 0;
while(binaryNum != 0) {
decimalNum += (binaryNum%10) * pow(2,count);
++count;
binaryNum/=10;
}
count = 1;
while (decimalNum != 0) {
octalNum += (decimalNum % 8) * count;
decimalNum /= 8;
count *= 10;
}
return octalNum;
}
int OctalToBinary(int octalNum) {
int decimalNum = 0, binaryNum = 0, count = 0;
while(octalNum != 0) {
decimalNum += (octalNum%10) * pow(8,count);
++count;
octalNum/=10;
}
count = 1;
while (decimalNum != 0) {
binaryNum += (decimalNum % 2) * count;
decimalNum /= 2;
count *= 10;
}
return binaryNum;
}
int main() {
int binaryNum = 1011, octalNum = 25;
cout <<"Binary to Octal"<<endl;
cout<<"Binary number: "<<binaryNum<<endl;
cout<<"Octal number: "<<BinarytoOctal(binaryNum)<<endl;
cout <<"Octal to Binary"<<endl;
cout<<"Octal number: "<<octalNum<<endl;
cout<<"Binary number: "<<OctalToBinary(octalNum)<<endl;
return 0;
}
実行結果
上記プログラムを実行すると、次のような出力が得られます。
Binary to Octal Binary number: 1011 Octal number: 13 Octal to Binary Octal number: 25 Binary number: 10101
プログラムの解説
このプログラムには、BinaryToOctal() と OctalToBinary() の2つの関数が用意されています。
BinaryToOctal() 関数:2進数から8進数への変換
この関数は、与えられた2進数を8進数に変換します。処理の手順としては、まず2進数を10進数に変換し、その後その10進数を8進数に変換するという2段階方式を採用しています。
- 最初のwhileループでは、2進数の下位の桁から順に取り出し、2のべき乗(2^0、2^1、2^2…)を掛けながら加算することで10進数を求めます。
- 次のwhileループでは、10進数を8で割った余りを順に取り出し、桁位置をずらしながら組み立てることで8進数を求めます。
該当するコードは以下の部分です。
int BinaryToOctal(int binaryNum) {
int octalNum = 0, decimalNum = 0, count = 0;
while(binaryNum != 0) {
decimalNum += (binaryNum%10) * pow(2,count);
++count;
binaryNum/=10;
}
count = 1;
while (decimalNum != 0) {
octalNum += (decimalNum % 8) * count;
decimalNum /= 8;
count *= 10;
}
return octalNum;
}
OctalToBinary() 関数:8進数から2進数への変換
こちらの関数は、与えられた8進数を2進数に変換します。先ほどと同様に、まず8進数を10進数に変換し、その後その10進数を2進数に変換するという流れで処理されます。
- 最初のwhileループでは、8進数の各桁に8のべき乗(8^0、8^1、8^2…)を掛けて加算し、10進数に変換します。
- 次のwhileループでは、10進数を2で割った余りを取り出して並べることで、2進数を組み立てます。
該当するコードは以下の部分です。
int OctalToBinary(int octalNum) {
int decimalNum = 0, binaryNum = 0, count = 0;
while(octalNum != 0) {
decimalNum += (octalNum%10) * pow(8,count);
++count;
octalNum/=10;
}
count = 1;
while (decimalNum != 0) {
binaryNum += (decimalNum % 2) * count;
decimalNum /= 2;
count *= 10;
}
return binaryNum;
}
main() 関数での呼び出し
main() 関数内では、変換元となる2進数「1011」と8進数「25」を定義しています。そして、BinaryToOctal() および OctalToBinary() をそれぞれ呼び出すことで、対応する8進数・2進数を計算して画面に表示します。以下がその該当コードです。
int main() {
int binaryNum = 1011, octalNum = 25;
cout <<"Binary to Octal"<<endl;
cout<<"Binary number: "<<binaryNum<<endl;
cout<<"Octal number: "<<BinarytoOctal(binaryNum)<<endl;
cout <<"Octal to Binary"<<endl;
cout<<"Octal number: "<<octalNum<<endl;
cout<<"Binary number: "<<OctalToBinary(octalNum)<<endl;
return 0;
}
まとめ
本記事では、2進数⇔8進数の相互変換をC++で実装する方法を紹介しました。ポイントは、直接変換せず10進数を中継点として扱うことです。この手法は他の基数変換にも応用できるため、基数の考え方とあわせてぜひ理解しておきましょう。
-
C++プログラムにおける二分探索(バイナリサーチ)の基本と実装
二分探索(バイナリサーチ)とは二分探索は「半区間探索」「対数探索」「バイナリチョップ」とも呼ばれる検索アルゴリズムで、ソート済みの配列の中から目的の値が存在する位置を効率的に見つけ出します。基本的な仕組みは非常にシンプルです。まず、探したい値(ターゲット値)を配列の中央の要素と比較します。一致しなかった場合は、ターゲット値が存在し得ない半分を丸ごと排除し、残りの半分に対して同様の比較を繰り返します。この「中央との比較」と「範囲の絞り込み」を続け、ターゲット値が見つかるか、検索範囲が空になる(=配列にその値が存在しない)かのどちらかで処理が終了します。アイデア自体は簡単ですが、正しく実装するには
-
C++で10進数を2進数に変換するプログラムの書き方
コンピューターの内部では、すべてのデータが2進数(基数2)として扱われています。一方、私たちが日常的に使う10進数は「0〜9」の数字を組み合わせた基数10の記数法です。この記事では、C++を使って入力された10進数を2進数へ変換するプログラムの考え方と実装方法を解説します。10進数から2進数への変換手順10進数を2進数に変換する基本的な方法は、「2で割った余りを順番に記録していく」ものです。具体的には次の手順で行います。まず、変換したい数値を基数である2で割り、商と余りを求めます。余りが0であればその桁は「0」、1であれば「1」として記録します。続いて、得られた商をさらに2で割り、同じように余