C++で数値の上位3ビットと下位3ビットを10進数に変換する方法
問題概要
本記事では、整数 N が与えられたときに、その2進表現における上位3ビットと下位3ビットをそれぞれ10進数に変換して求める問題を扱います。
まず、具体例で問題を確認しましょう。
入力:57 出力:7 1
57 を2進数に変換すると「111001」になります。上位3ビットは「111」で10進数の 7、下位3ビットは「001」で10進数の 1 に対応するため、出力は「7 1」となります。
解法のアプローチ
最もシンプルな解き方は、次の手順に従うものです。
- 数値 n を2進数に変換し、各ビットを配列に保存する。
- 配列の中から上位3ビットと下位3ビットを取り出す。
- それぞれのビット列を独立した数値として10進数に変換する。
こうして得られた2つの10進数値が答えとなります。
例として、数値 80 を考えてみましょう。
- 80 の2進数表現は「1010000」です。
- 上位3ビット「101」の10進数値は 5 です。
- 下位3ビット「000」の10進数値は 0 です。
- したがって、出力は「5 0」になります。
C++による実装例
上記の解法を実際に実装したプログラムが以下です。
#include <bits/stdc++.h>
using namespace std;
void convtbnTodcml(int n)
{
int arr[64] = { 0 };
int x = 0, index;
for (index = 0; n > 0; index++) {
arr[index] = n % 2;
n /= 2;
}
x = (index < 3) ? 3 : index;
int d = 0, p = 0;
for (int index = x - 3; index < x; index++)
d += arr[index] * pow(2, p++);
cout << d << " ";
d = 0;
p = 0;
for (int index = 0; index < 3; index++)
d += arr[index] * pow(2, p++);
cout << d;
}
int main()
{
int n = 57;
cout<<"Decimal conversion of first and last bits of the number "<<n<<" is ";
convtbnTodcml(n);
return 0;
}
コードのポイント
関数 convtbnTodcml では、n を2で割った余りを順に配列 arr へ格納することで、下位ビットから並ぶ2進表現を作成しています。そのため、配列の先頭側3要素が下位3ビット、末尾側3要素が上位3ビットに対応します。あとは各要素に2の累乗を掛けて合計すれば、目的の10進数値が得られます。なお、x = (index < 3) ? 3 : index という条件により、元の数値のビット数が3未満の場合でも正しく動作するようになっています。
実行結果
Decimal conversion of first and last bits of the number 57 is 7 1
-
C++でキロバイトをバイトとビットに変換するプログラム
キロバイト(KB)を入力として受け取り、それをバイト数とビット数に変換するC++プログラムを紹介します。データサイズの単位変換は、プログラミングの基礎を学ぶうえで非常に重要なテーマです。ビット(Bit)とはコンピュータにおいて、ビットは情報の最小単位であり、0と1という2つの整数値で表されます。コンピュータ内のすべての情報は、この2つの数字の列として処理されます。Nビットで表現できるパターン数は 2N 通りとなります(Nは1以上の任意の整数)。バイト(Byte)とはコンピュータにおいて、バイトは8ビットで構成される単位です。バイト1つで英数字1文字、または0から255までの範囲の数値を表現でき
-
Excelで氏名を姓・名・ミドルネームに分割する2つの方法
```html 顧客リストや名簿など、フルネームがひとつのセルにまとめて入力されたデータを扱うことは少なくありません。こうした名前を「名(ファーストネーム)」「ミドルネーム」「姓(ラストネーム)」の3つに分割できれば、並べ替えや絞り込み、集計作業が格段にしやすくなります。Microsoft Excelでは、区切り位置(Delimiter/Separator)機能を使う方法と、数式を使う方法の2通りで氏名を分割できます。 Excelで姓と名を分ける方法 氏名を姓と名に分ける主な目的は、社員や学生などのグループを、姓または名を基準に分類・整理することです。Excelでは、次の2つの方法で対応できま