1. 0x12345678 -> 0x78563412
  2. 0x00000001 -> 0x01000000
  3. 0xFF000000 -> 0x000000FF
  4. 0x00000000 -> 0
  5. 0xAABBCCDD -> 0xDDCCBBAA
コース一覧
コンピューターサイエンス入門:理論編
エンディアンの入れ替え (uint32)

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

エンディアンの入れ替え (uint32)

バイト順の入れ替えと4ビット反転

別のマシンが書き出したファイルを読んだら、数字が桁違いに大きくなっていた。バイトは 1 つも壊れていないのに、値だけが違う。こういうことが起こります。原因は、バイトを並べる向きです。

バイトは同じなのに、値が 2 通りある

4 バイトの整数をメモリやファイルに置くとき、上の桁のバイトから順に置く流儀と、下の桁のバイトから順に置く流儀があります。前者がビッグエンディアン、後者がリトルエンディアンです。

プレーンテキスト

0x12345678 を 4 バイトで置く ビッグエンディアン 12 34 56 78 リトルエンディアン 78 56 34 12

並んでいるバイトを見ても、どちらの向きで書かれたかはどこにも書いてありません。読む側が向きを取り違えると、まったく別の値として読めてしまいます。2 バイトで試すと差がはっきりします。

Python

data = bytes([0x00, 0x50]) print(int.from_bytes(data, "big")) # 80 print(int.from_bytes(data, "little")) # 20480

同じ 2 バイトが、向きを変えるだけで 80 にも 20480 にもなります。80 番は HTTP のポートですから、これを取り違えると接続先ごと変わります。しかもどちらの値も、数としては正しく見えます。

向きは決めごとであって、バグではない

インターネットを流れるパケットのヘッダはビッグエンディアンと決まっていて、これをネットワークバイトオーダーと呼びます。一方、いま使っている PC やスマホの CPU はほとんどがリトルエンディアンです。つまり通信のたびに、どこかで並べ替えが起きています。C の htonl や ntohl、Java の ByteBuffer.order は、どれもこの並べ替えのための道具です。

自分でバイナリの形式を決めるときも、まず向きを仕様に書きます。書き手と読み手で約束が食い違うと、値が化けるという形でしか表面化せず、原因にたどり着くのに時間がかかります。

どちらが正しいという話ではありません。CPU の設計上の都合で分かれただけで、両方が現役です。だから橋渡しが要ります。

並べ替えは、1 バイトずつ取り出して置き直す

4 バイトの並びを逆にする手順は 2 段構えです。まず、ほしいバイトを右端まで運んでから、下 8 ビットだけを残して取り出します。次に、それを置きたい位置まで左へ運んで、重ね合わせます。取り出しと置き直しを 4 回分そろえれば、並びは反対になります。

紙に 16 進数で書き出して、どのバイトがどこへ動くかを先に決めておくと迷いません。運ぶ距離を 1 か所でも間違えると、途中のバイトが重なって消えます。取り出すときに残す幅を 8 ビットより狭くしても、同じように上のほうが欠けます。

JavaScript には別の注意があります。ビット演算のあいだ、値は 32 ビットの符号付き整数として扱われるので、最上位のバイトを触ると結果が負の数になります。

JavaScript

console.log(1 << 31); // -2147483648 console.log((1 << 31) >>> 0); // 2147483648

>>> 0 を通すと符号なしの値に戻せます。Python の整数には桁の上限が無いので、この心配はいりません。

要件

  1. endianSwap という名前の関数を実装すること
  2. シフト演算とマスク 0xFF を使って各バイトを取り出すこと
  3. 32bit 範囲 (0 〜 0xFFFFFFFF) の入力で正しく動くこと

入出力例

endianSwap(305419896) → 2018915346 endianSwap(1) → 16777216 endianSwap(4278190080) → 255 endianSwap(0) → 0 endianSwap(2864434397) → 3721182122

ヒント

(n >> 24) & 0xFF で最上位バイトが取れる

取り出した 4 バイトを逆順に << 24, << 16, << 8 で積み直す

JS では >>> 0 で符号なしに整える

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • バッファ範囲チェック

    オフセットと長さが固定サイズバッファに収まるかを判定する

  • 第5章まとめクイズ

    バイト・KB変換、キャッシュ、LRU、エンディアン、バッファ範囲を総復習する4択クイズ

  • Base64 エンコード後の長さ計算

    バイト列を Base64 エンコードしたときの文字数を、入力長から数式で求める関数を作ります。

  • 重複データを 1NF に変換 (フラットなリスト化)

    1 セルに複数値が詰め込まれた CSV 風データを、1 行 = 1 値にフラット化する第一正規形(1NF)の変換を実装します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • メモリプログラムとデータを一時保持する高速領域
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • インターネット世界中のコンピュータをつなぐネットワークの集合体。
  • 設計何をどう作るかを決める前工程
  • ビット2進数の1桁。0 か 1 のどちらか
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 関数処理に名前を付けて再利用できる単位
main.py
学習モード
エディタを読み込んでいます

メモ

エンディアンの入れ替え (uint32)

⌘S で保存