バイナリ変換の完全ガイド:十進数↔二進数からIEEE 754・文字コードまで、実務で使える基礎と応用

バイナリ変換とは — 概要

バイナリ変換とは、データや数値を二進数(バイナリ)表現に変換する操作全般を指します。コンピュータ内部では情報は0と1のビット列として扱われるため、十進数や文字列、実数などを二進数へ正しく変換することは、プログラミングやデジタル回路設計、データ通信などITの広範囲で基本中の基本です。本コラムでは基礎理論から実務で押さえるべきポイント、代表的な変換アルゴリズムと実例、符号付き整数や浮動小数点表現(IEEE 754)、文字エンコーディングまで詳細に解説します。

なぜ二進数(バイナリ)なのか

  • 電子回路はオン/オフ(高/低電圧)という二状態を簡単に扱えるため、0/1での情報処理が自然。
  • ビット単位の演算(論理演算、シフトなど)が高速で簡潔。
  • ハードウェア上での設計や最適化が行いやすく、信頼性と再現性が高い。

二進法の基礎(表記法)

二進数は各桁が2の累乗に対応する位置値表記です。例えば 1101₂ は 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1 = 13(十進)。桁位置は右端が2⁰、左へ行くごとに指数が1増えます。

整数だけでなく小数も同様に、2^-1 = 0.5、2^-2 = 0.25 のように表されます。

基本的な変換方法

十進数 → 二進数(整数)

繰り返し2で割り、余りを下から順に並べる方法(剰余法)が一般的です。手順:

  • 対象の十進整数を2で割り、余り(0または1)を記録。
  • 商が0になるまで商をさらに2で割って余りを記録。
  • 最後に記録した余りを逆順(最後の余りが最上位ビット)に並べると二進数。

例:13 → 13÷2=6 余1、6÷2=3 余0、3÷2=1 余1、1÷2=0 余1 → 逆順で 1101₂。

十進数 → 二進数(小数)

小数部は「2倍して整数部を取り出す」方法を使います。手順:

  • 小数部を2倍し、その整数部(0または1)を取り出す。
  • 残った小数部を再び2倍して整数部を取り出す。必要桁数まで繰り返す。
  • 整数部を順に並べると小数部の二進表現。

例:0.625 → 0.625×2=1.25(1)、0.25×2=0.5(0)、0.5×2=1.0(1) → 小数部 .101₂。

無限に続く場合(例えば 0.1₁₀ は 二進で非巡回)には丸めが必要です。

二進数 → 十進数

各ビットを2の該当累乗で重み付けして合計します。例:1011₂ = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 11₁₀。

進数間変換の効率的な方法(16進、8進との関係)

16進(HEX)は4ビットごと、8進は3ビットごとに二進数と対応するため、グルーピングで簡単に変換できます。例:二進 1101 1110 を4ビット区切りすると 1101(=D) 1110(=E) → 0xDE。

符号付き整数表現:符号ビット、1の補数、2の補数

コンピュータで負の数を扱う代表的な方式は2の補数です。nビットの2の補数表現では表現範囲が -2^(n-1) ... 2^(n-1)-1 となり、演算(加算・減算)が単純になります。

2の補数の求め方:正の数のビットを反転(1↔0)してから1を加える。例えば 4ビットで -3 を表すには、3=0011 → 反転=1100 → +1 = 1101(= -3)。

1の補数や符号・大きさ(sign-magnitude)表示も存在しますが、0が正と負で二重になるなどの欠点があります。

浮動小数点(IEEE 754)

実数を二進で表す標準は IEEE 754(単精度32ビット、倍精度64ビットなど)。構成は sign(1) | exponent(バイアス付) | fraction(仮数部) です。

  • 単精度(32ビット):符号1ビット、指数8ビット(バイアス127)、仮数23ビット(先頭は規格上暗黙の1)。
  • 倍精度(64ビット):符号1、指数11(バイアス1023)、仮数52。

特殊値:指数がすべて1か0の場合にサブノーマル、無限大、NaN等が表されます。浮動小数点は有限のビット数で実数を表すため丸め誤差や表現できない値が存在する点に注意(例:0.1₁₀は二進で非終端)。

文字とバイナリ(ASCII、UTF-8)

テキストは通常文字コードをバイナリに対応させて格納します。ASCIIは7ビットで英数字や制御文字を表し、拡張ASCIIや各国語の文字にはUTF-8などの可変長エンコーディングを使います。UTF-8は1~4バイトでコードポイントを表し、バイト列は当然バイナリデータです。

例:ASCII 'A' は 65₁₀ = 01000001₂。UTF-8で 'あ' のような日本語は3バイト(1110xxxx 10xxxxxx 10xxxxxx)の組合せになります。

ビット演算と応用

AND, OR, XOR, NOT、左シフト/右シフトなどのビット演算は二進表現を直接扱います。用途はフラグ管理、マスク処理、パフォーマンスチューニング、ハッシュ、暗号、組込み処理など多岐に渡ります。

実務での注意点

  • 有限ビットによる丸め誤差(特に浮動小数点)を理解し、金融計算など精度が重要な場面では整数(最小単位で扱う)や任意精度ライブラリを使う。
  • 符号付き/符号なしの混在はバグのもと(オーバーフロー・比較の誤り)。データ型と範囲を明確にする。
  • エンディアン(バイト順序)に注意。ビット列自体の意味は変わらないが、バイト列を並べる順序はプラットフォーム依存。
  • 文字エンコーディングの不一致は文字化けやセキュリティ脆弱性を誘発する。

実装例(Python)

簡単なコード例を示します。WordPress に貼る場合は <pre> タグごと貼り付ければ読みやすくなります。

# 十進整数を二進文字列に変換
def dec_to_bin(n):
    if n == 0:
        return '0'
    neg = n < 0
    n = abs(n)
    bits = []
    while n:
        bits.append(str(n % 2))
        n //= 2
    s = ''.join(reversed(bits))
    return '-' + s if neg else s

# 二進文字列を十進に変換
def bin_to_dec(s):
    return int(s, 2)

# 小数の変換(例: 0.625 -> '0.101')
def frac_dec_to_bin(frac, max_bits=20):
    bits = []
    f = frac
    for _ in range(max_bits):
        f *= 2
        if f >= 1:
            bits.append('1')
            f -= 1
        else:
            bits.append('0')
        if f == 0:
            break
    return '0.' + ''.join(bits)

まとめ

バイナリ変換はコンピュータ科学の核となる基礎技術です。整数・小数の変換方法、符号表現(2の補数)、浮動小数点規格(IEEE 754)、文字エンコーディング(ASCII/UTF-8)など、それぞれの特性を理解することで、正確で効率的な処理・デバッグ・設計が可能になります。実務では丸め誤差、型の取り扱い、エンディアンやエンコーディングの差に注意してください。

参考文献