n進数とは?基礎から応用まで完全解説 - 変換方法とプログラミング実装

n進数の基本概念から2進数・8進数・16進数との関係、プログラミングでの実装方法まで詳しく解説。JavaScript/Python/C++での変換コード例やよくある間違いも紹介。進数変換の仕組みを完全理解しましょう。

November 4, 2025
16to10 Team
4 min read
Other Languages
Table of Contents

This article is not available in en. Showing ja version.

はじめに

n進数は現代のデジタル技術を支える重要な数学的概念です。コンピュータが2進数で動作し、プログラミングで16進数が頻繁に使用される背景には、n進数の基本原理が深く関わっています。本記事では、n進数の基本的な概念から実践的なプログラミング応用まで、段階的に詳しく解説します。

n進数の基本概念

n進数とは、基数nを用いた位取り記数法のことを指します。私たちが日常的に使用する10進数はn=10の場合に相当し、0から9までの10個の数字を使用します。

n進数の数学的定義

n進数は次のように表されます:

a_k × n^k + a_{k-1} × n^{k-1} + ... + a_1 × n^1 + a_0 × n^0

ここで、各a_iは0からn-1までの整数です。

主要なn進数の種類

  • 2進数 (Binary): 基数2 - 0,1のみ使用
  • 8進数 (Octal): 基数8 - 0〜7を使用
  • 10進数 (Decimal): 基数10 - 0〜9を使用
  • 16進数 (Hexadecimal): 基数16 - 0〜9、A〜Fを使用

プログラミング言語別n進数処理

JavaScriptでのn進数変換

JavaScriptではtoString()メソッドとparseInt()関数を使用してn進数変換を行います。

JAVASCRIPT
// 10進数からn進数への変換
const decimalNumber = 255;

// 2進数への変換
const binary = decimalNumber.toString(2);
console.log(binary); // "11111111"

// 8進数への変換
const octal = decimalNumber.toString(8);
console.log(octal); // "377"

// 16進数への変換
const hexadecimal = decimalNumber.toString(16);
console.log(hexadecimal); // "ff"

// n進数から10進数への変換
const binaryString = "11111111";
const decimalFromBinary = parseInt(binaryString, 2);
console.log(decimalFromBinary); // 255

const hexString = "ff";
const decimalFromHex = parseInt(hexString, 16);
console.log(decimalFromHex); // 255

Pythonでのn進数処理

Pythonでは組み込み関数を使用してn進数変換を簡単に行えます。

PYTHON
# 10進数からn進数への変換
decimal_number = 255

# 2進数への変換
binary = bin(decimal_number)
print(binary)  # '0b11111111'

# 8進数への変換
octal = oct(decimal_number)
print(octal)   # '0o377'

# 16進数への変換
hexadecimal = hex(decimal_number)
print(hexadecimal)  # '0xff'

# n進数から10進数への変換
binary_string = "11111111"
decimal_from_binary = int(binary_string, 2)
print(decimal_from_binary)  # 255

hex_string = "ff"
decimal_from_hex = int(hex_string, 16)
print(decimal_from_hex)  # 255

# 任意の基数への変換関数
def to_base_n(number, base):
    if number == 0:
        return "0"
    digits = []
    while number:
        digits.append(str(number % base))
        number //= base
    return ''.join(digits[::-1])

# 10進数255を7進数に変換
base7 = to_base_n(255, 7)
print(base7)  # "513"

C++でのn進数操作

C++ではstd::bitsetやストリームマニピュレータを使用してn進数処理を行います。

CPP
#include <iostream>
#include <bitset>
#include <sstream>
#include <iomanip>

using namespace std;

int main() {
    int decimalNumber = 255;
    
    // 2進数表示
    cout << "2進数: " << bitset<8>(decimalNumber) << endl;
    
    // 8進数表示
    cout << "8進数: " << oct << decimalNumber << endl;
    
    // 16進数表示
    cout << "16進数: " << hex << decimalNumber << endl;
    
    // 10進数に戻す
    cout << "10進数: " << dec << decimalNumber << endl;
    
    // 文字列からの変換
    string binaryStr = "11111111";
    string hexStr = "ff";
    
    int fromBinary = stoi(binaryStr, nullptr, 2);
    int fromHex = stoi(hexStr, nullptr, 16);
    
    cout << "2進数から: " << fromBinary << endl;
    cout << "16進数から: " << fromHex << endl;
    
    return 0;
}

実践的な応用例

カラーコードの変換

16進数はWeb開発でカラーコードとして頻繁に使用されます。

JAVASCRIPT
// 16進数カラーコードの処理
function hexToRgb(hexColor) {
    const hex = hexColor.replace('#', '');
    const r = parseInt(hex.substring(0, 2), 16);
    const g = parseInt(hex.substring(2, 4), 16);
    const b = parseInt(hex.substring(4, 6), 16);
    return { r, g, b };
}

function rgbToHex(r, g, b) {
    return '#' + [r, g, b].map(x => {
        const hex = x.toString(16);
        return hex.length === 1 ? '0' + hex : hex;
    }).join('');
}

// 使用例
const rgb = hexToRgb('#ff00ff');
console.log(rgb); // { r: 255, g: 0, b: 255 }

const hex = rgbToHex(255, 0, 255);
console.log(hex); // "#ff00ff"

ファイルパーミッションの計算

Unix系システムではファイルパーミッションを8進数で表現します。

PYTHON
def calculate_permissions(octal_value):
    """8進数のパーミッション値を人間が読める形式に変換"""
    permission_map = {
        '0': '---',
        '1': '--x',
        '2': '-w-',
        '3': '-wx',
        '4': 'r--',
        '5': 'r-x',
        '6': 'rw-',
        '7': 'rwx'
    }
    
    octal_str = str(octal_value)
    result = ''
    for digit in octal_str:
        result += permission_map[digit]
    return result

# 使用例
print(calculate_permissions(755))  # rwxr-xr-x
print(calculate_permissions(644))  # rw-r--r--

よくある間違いと解決策

間違い1: 基数の指定忘れ

JAVASCRIPT
// 間違った例
const binaryStr = "1010";
const wrongDecimal = parseInt(binaryStr); // 1010(10進数として解釈)

// 正しい例
const correctDecimal = parseInt(binaryStr, 2); // 10(2進数として解釈)

間違い2: 大文字・小文字の混在

PYTHON
# 間違った例(Python)
hex_value = "FF"
decimal_wrong = int(hex_value, 16)  # エラーにはならないが、一貫性がない

# 正しい例
hex_value_lower = "ff"
decimal_correct = int(hex_value_lower, 16)  # 255

# または明示的に小文字に変換
hex_value_upper = "FF"
decimal_consistent = int(hex_value_upper.lower(), 16)  # 255

間違い3: 不正な文字の処理

CPP
// 安全な変換関数
#include <stdexcept>

int safe_parse_int(const string& str, int base) {
    try {
        size_t pos;
        int result = stoi(str, &pos, base);
        
        // すべての文字が変換されたかチェック
        if (pos != str.length()) {
            throw invalid_argument("無効な文字が含まれています");
        }
        return result;
    } catch (const exception& e) {
        cerr << "変換エラー: " << e.what() << endl;
        return -1;
    }
}

パフォーマンス比較

異なるn進数変換方法のパフォーマンスを比較します。

PYTHON
import timeit

# 方法1: 組み込み関数使用
def method_builtin(num, base):
    if base == 2:
        return bin(num)
    elif base == 8:
        return oct(num)
    elif base == 16:
        return hex(num)
    else:
        return format(num, 'd')

# 方法2: フォーマット関数使用
def method_format(num, base):
    return format(num, {
        2: 'b', 8: 'o', 16: 'x'
    }.get(base, 'd'))

# 方法3: カスタム関数
def method_custom(num, base):
    if num == 0:
        return "0"
    digits = []
    n = num
    while n:
        digits.append(str(n % base))
        n //= base
    return ''.join(digits[::-1])

# パフォーマンス測定
number = 1000000
base = 16

time_builtin = timeit.timeit(lambda: method_builtin(number, base), number=10000)
time_format = timeit.timeit(lambda: method_format(number, base), number=10000)
time_custom = timeit.timeit(lambda: method_custom(number, base), number=10000)

print(f"組み込み関数: {time_builtin:.6f}秒")
print(f"フォーマット: {time_format:.6f}秒")
print(f"カスタム関数: {time_custom:.6f}秒")

よくある質問(FAQ)

Q: n進数でnが36より大きい場合はどうなりますか?

A: 36進数までは数字(0-9)とアルファベット(A-Z)を使用します。37進数以上が必要な場合は、追加の記号を定義するか、Unicode文字を使用するなどの方法があります。実際のプログラミングでは、ほとんどの言語が2〜36進数をサポートしています。

Q: 負の数のn進数表現はどうなりますか?

A: 負の数の表現方法にはいくつかの方式があります。2進数では「2の補数表現」が一般的です。他の基数でも同様の概念が適用されますが、プログラミング言語によって実装が異なる場合があります。

Q: 浮動小数点数をn進数で表現できますか?

A: はい、可能ですが整数ほど標準化されていません。浮動小数点数のn進数表現は、整数部と小数部に分けて処理するか、科学技術記法のような形式を使用します。

まとめ

n進数は現代のコンピューティングにおいて不可欠な概念です。2進数がコンピュータの基礎となり、16進数がメモリアドレスやカラーコードなどで広く使用されています。適切なn進数の理解と変換技術は、効率的なプログラミングとデバッグに大きく貢献します。

さまざまなプログラミング言語でのn進数処理方法をマスターし、実際のプロジェクトで応用することで、より深い理解が得られるでしょう。進数変換に関する詳細な情報は、MDN Web DocsPython公式ドキュメントで確認できます。