初心者向けC/C++演習

C・C++で10進数を2進数に変換する

このレッスンでは、2で割り続ける方法で、正の整数を10進数から2進数に変換します。

はじめに

数を2進数に変換するには、その数を2で割り続け、割るたびに余りを書き留めます。余りがそのまま2進数の各桁になりますが、最後の桁(いちばん下の位)から先頭の桁へ向かって順に求まります。

大切なポイント

  • コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
  • それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
  • 入力データと配列のインデックスの範囲は必ずチェックしましょう。

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>
int main(void) {
    unsigned number = 13, value = number; int bits[32], count = 0;
    // Store remainders generated from right to left.
    do { bits[count++] = value % 2; value /= 2; } while (value);
    printf("%u = ", number); while (count) printf("%d", bits[--count]); puts("");
}
実行結果
13 = 1101
C++
実行 →
main.cpp
#include <bitset>
#include <iostream>
#include <string>
int main() {
    unsigned number = 13;
    // Remove leading zeroes from a fixed-width bitset string.
    std::string bits = std::bitset<32>(number).to_string();
    bits.erase(0, bits.find_first_not_of('0'));
    std::cout << number << " = " << bits << '\n';
}
実行結果
13 = 1101

CとC++の比較

do-whileループは、余りvalue % 2を配列bitsに保存してからvalueを2で割り、valueが0になるまで続けます。do-whileを使うのは、0でも少なくとも1桁が得られるようにするためです。割り算では最後の桁が先に求まるので、プログラムは配列bitsを逆順に表示し、13は1101と表示されます。

C

Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。

C++

C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • 不正な入力や境界の値で試しましょう。
  • 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
  • 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ