暗算で 16 進数を 2 進数に変換する方法

C 言語などでビットの定義を行う場合、 ビットシフト(<<)も使いますが、 16 進数で表記することも多いです。 何故 16 進数で記述するかというと 16 進数は 2 進数に変換しやすいためです。
C 言語でゴリゴリ書くのが主流だった時代は、 結構みんな独自の計算方法を持っていて、すぐに 2 進数に変換していました。 しかし、最近ではこの変換をできない人が増えてきた気がします。
そこで今回は私がやっている暗算で 16 進数を 2 進数に変換する方法を紹介したいと思います。 ただ、魔法のような便利な方法があるわけではなく、掛け算における九九のように暗記よる部分が多いです。

進数表記の基礎

まず最初に進数表記について簡単に説明します。
進数表記の種類としては 16, 10, 8, 2 進数などがあり、 通常、私達が使っているのは 10 進数です。

2, 8 進数などの場合、たまに 2, 8 まで使えると勘違いする人がいます。 これは 10 進数を考えると分かりやすいと思います。
10 進数では 0-9 までの 10 個の数字を使い、 10 で一つ桁上りします。
同様に 2 進数では 0, 1 の 2 つの数字を使い、 2 で一つ桁上りして 10 となります。 さらに 3 は 10 + 1 = 11 となり、 4 は 2 桁目も繰り上がり 100 となります。

16 進数では逆に 9 までの数字では足りないので、 A-F (a-f)のアルファベットを足して 一桁 15 までとなり、 16 が 10 となります。

8 進数から 2 進数への変換

16 進数の前に 8 進数から 2 進数への変換を身につける必要があります。
実際どうやるかというと、次の表の変換を全部覚えるという力技です。

8 進数 2 進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111

ただそれだけだとあんまりなので、少し暗記のコツを書いておきます。

0-3: ここぐらいまでは 2 進数を理解していれば、覚えるまでもなくすぐに計算できるはずです。

4: 2, 4, 8 といった 2 の乗数は 2 進数の特徴でビット(1)が一個ずつずれていく感じになるので、 覚えやすいのではないかと思います。

7: これは 8 の一つ手前は全部ビットが立つと覚えます。

後は 5, 6 の 2 つを頑張って覚えれば完了です。


8 進数を使っている例としては Unix の chmod コマンドでの 8 進数による指定があります。 最初はこんなわかりづらいの誰が使うのだろうと思っていたのですが、 プログラミングをやりだした後は結構 8 進数で指定するようになっていました。

16 進数から 2 進数への変換

それではいよいよ 16 進数からの変換です。

これは 8 と残りというように考えて計算します。例えば A は 10 なので、 8 + 2 です。 8 は 1000 なので、 8 進数の変換とあわせて次のように計算します。
  A (Hex) = 8 + 2 = 1000 + 10 = 1010 (Bin)
ここで必要となってくるのが、 8 引いた残りの値ですが、 これはまた暗記します。
16 進数 8 + x
A 2
B 3
C 4
D 5
E 6
F 7

最初の A と最後の F は覚えやすいと思います。 あと、 C, D の真ん中辺りをしっかり覚えれば、アルファベット順なので B, E はすぐ出てきます。


「こんなにいろいろ覚えるのであれば、 最初から 0 から F までの 2 進数の変換結果を覚えればいいのでは?」と思われるかもしれません。
しかし、 人は記憶するとき 3 つまでは記憶しやすいと言われています。 4 桁を覚えるのは結構キツイです。


ここまで読んでみて「大変そう」と感じるかもしれませんが、やってみたら大したことはないです。 知っていると便利ですし、 プログラマーの特有の変わった技術として身につけておくのもいいのではないでしょうか。



スポンサーサイト
 

Emacs (24.5 以上) の Windows へのインストール

以前 Emacs の Windows でのインストール方法に関する記事を書きました。 その時の Emacs のバージョンは 24.2 だったのですが、バージョンが上がり、 インストール方法が少し変わっていました。 今回は再度インストール方法について説明したいと思います。

Emacs 24

GNU が作成しているEmacs は 独自の日本語入力機能をもっていて、 IME が使えません。 IME を使うにはパッチを当てた Emacs をインストールする必要があります。
前回はそのうち gnupack と emacs 単体でのインストール方法について説明しました。 今回はそれに加え、前回からのアップグレードの方法についても説明します。
  1. gnupack(Cygwin+Emacs) のインストール
  2. Emacs 単体のインストール
  3. Emacs 単体のアップグレード(以前環境からの引っ越し)

gnupack(Emacs+Cygwin) のインストール

パッチのあたった Emacs と Cygwin をまとめてすぐ使えるようにした gnupack が公開されています。 Cygwin とは Windows で Unix 環境を作り、 Unix のツール群を使えるようにするものです。

ただ、個人的には Cygwin 環境があまり好きではないので、 Emacs 単体で使っています。 とはいっても「Windows を使っている時は Windows と仲良い感じがいいかな」という気分の問題で、 Cygwin はそんなに悪いものではありません。
gnupack は面倒な設定がいらず、初めて Emacs を使う方にはこちらの方がお勧めです。

そこで、まず gnupack で Emacs をインストール方法について紹介します。

ダウンロード

gnupack は以下のサイトからダウンロードできます。 develop とついているのは開発版なので、 gnupack_basic-XX.XX.YYYY.MM.DD.exe の方がいいでしょう。

インストール

ダウンロードロードしたファイルは自己解凍形式のファイルで、実行すると解凍されます。
インストールしたいところに解凍して下さい。解凍すると gnupack_basic-XX.XX-YYYY.MM.D というフォルダーが作成されます。

gnupack は解凍しただけですぐ使えます。 展開したフォルダーの直下にある startup_emacs.exe を実行すると emacs が起動します。

Cygwin 環境でのパス

Cygwin 環境ではマウントといって、 Unix に近くなるよう少しパスが変わっています。 初めて使う方は少し戸惑うかもしれません。
簡単に説明すると次のような感じです。
  • パス区切りが \ ではなく /
  • 全てのパスは / (ルート) から始まる
    • / 自体は展開したフォルダーにマウント
  • C:\, D:\ ドライブは /c/, /d/
詳しくは UsersGuide.html のディレクトリー構成を読んで下さい。 こちらも展開したフォルダーの直下にあります。

gnupack の設定

そのままでも使えるのですが、アップグレードがやりやすいようにやっておいた方が良い設定を紹介します。

一つ目はフォルダー名の変更です。
ショートカットを作った際にアップグレード時に変更しなくていいように -XX.XX-YYYY.MM.D の部分は取り除いておきます。


もう一つは ホームディレクトリーの変更です。
ホームディレクトリーというのは Unix におけるユーザーのトップディレクトリーで、ここに設定ファイルなどを置きます。 そのため、アップグレードしてもそのままにしておいた方がいいのですが、 デフォルトでは展開したフォルダーの home になっています。これを変更します。

まず適当にホームディレクトリーを決めます。 私の場合はマイドキュメントと同じフォルダーにしています。
これを環境変数 HOME に設定します。

次に展開フォルダー以下にある startup_config.ini を修正します。 このファイル内で HOME を指定している行を削除します。
 [Process Variable]
    CYGWIN_DIR = %ROOT_DIR%\app\cygwin\cygwin

    HOME      = %ROOT_DIR%\home # ← この行を削除
    TMP       = %TEMP%\gnupack
    TEMP      = %TMP%
これでホームディレクトリーは環境変数で指定した場所になります。 あとは gnupack の home 以下を HOME に指定したフォルダーにコピーします。


ちなみに、前回 gnupack の設定で書いておいた [変換] キー等を無効にする設定は取り込まれ、 スクロール時にフリーズする問題は解決されていて 修正する必要がなくなっています。

Emacs 単体でのインストール

次に Cygwin 抜きの Emacs だけをインストールする方法を説明します。 Emacs だけで十分という人はこちらの方法でインストールして下さい。

ダウンロード

gnupack のサイトでは Emacs 単体のパッケージも用意されています。 しかし、 Emacs のバージョンは 24.2 のまま止まっていました。 gnupack 内の Emacs はというと Cygwin のライブラリーがないと動作しません。

そのため、パッチをあてた Emacs パッケージを公開している別のサイトを利用します。 以下のサイトから最新(emacs-24.5-shared-libgcc-nodebug.zip, 2015-06-10 時点)の Emacs をダウンロードして下さい。 ダンロード後、圧縮ファイルをインストールしたい先に展開します。

環境変数の設定

次の 2 つの環境変数を設定します。
環境変数 設定値
HOME 好きなフォルダー (マイドキュメントと同じフォルダーなど)
Path bin フォルダーのパスを追加

grep, diff のインストール

Cygwin は使わないのですが、 grep や diff コマンドは結構使います。
grep
Step by step 正規表現入門 - 英数字とエディターでの検索 | プログラマーズ雑記帳
diff
Emacs のファイル差分表示(ediff, diff)機能の使い方 | プログラマーズ雑記帳
以前の記事では grep, diff を個別にインストールする方法を紹介しました。
しかし、 GCC のパッケージの中に MSYS というのがあり、 これには bash と grep, diff といった Unix 系の基本的なツールがセットで入っています。 MSYS をインストールした方が簡単だと思います。

MSYS に関しては以前の記事を参考にインストールして下さい。

起動

以上でインストールは完了です。
起動する場合には bin フォルダー内の runemacs.exe をショートカットを作るなどして実行してください。

gnupack を利用した Emacs の設定

インストールは完了しましたが、 Emacs ではこの後いろいろ設定しないと満足には動きません。
そこで gnupack の設定を利用する方法を紹介しておきます。
  1. gnupack をダウンロードして適当なところに展開
  2. その中の home/.emacs.d フォルダーを HOME として指定したフォルダー(~)にコピー
  3. ~/.emacs.d/init.el を修正
    • migemo, server のセクションを削除
ここでは簡単のために migemo を削除しましたが、使いたい場合は以前の記事を参考にして下さい。

Emacs 単体のアップグレード

以前の記事を見て Emacs 単体でインストールした人向けに Emacs をアップグレードする方法についても説明します。

  1. Emacs 単体のインストールで紹介したサイトから Emacs をダウンロード
  2. 古い Emacs のフォルダーを別名にして、ダウンロードしたファイルをインストール先に展開
  3. 古い Emacs から site-lisp の中身を移動 (site-lisp の場所が変更されています)
    • emacs/site-lisp(旧) → emacs/share/emacs/site-lisp(新)
  4. ~/.emacs.d/init.el を修正
    • menu-tree のセクションを削除
menu-tree はメニューを日本語に変更する elisp なのですが、 残念ながら新しいバージョンでは使えなくなっています。

これで今まで通り使えるようになっているはずです。
なお、 起動後 "Package assoc is obsolete!" とメッセージがでることがあります。 これは「assoc パッケージは obsolete(非推奨) だから使うな」というメッセージですが、 動作に影響は無いので気にする必要はありません。



 

LLVM Clang の Windows へのインストールと使い方

C, C++ 言語のコンパイラーといえば、 Windows では Visual Studio 、 Unix 系では gcc(g++) というのが多いです。 そんな中、最近 Clang があちこちで使われ始めるようになってきました。
今回はこの Clang の Windows へのインストール方法と使い方について説明します。

Clang とは

ClangLLVM で作られた C, C++, Objective-C, Objective-C++ のコンパイラーです。 LLVM(Clang) の開発には Apple や Google などの企業も参加、資金提供しています。
Clang はgcc の代替を狙っており、 Apple の後押しが大きく、 Mac ではすでに主要なコンパイラーとなっているらしいです。さらに Mac だけでなく、Unix や Windows などクロスプラットホームで使われるようになってきました。

因みに Clang の発音は「クラン」が近いみたいです。 最後の g は HongKong(香港)や Erlang(アーラン)のように日本人にはほとんど聞き取れない音です。

Clang を使うメリット

Clang のメリットとしてよく言われるのが、エラーメッセージが分かりやすいという点です。
C++ では STL などのテンプレートを使った際のコンパイルエラーのメッセージがわかりづらく、 メッセージを見ても、どこが悪いのか、どう直せばいいのかわからないといったことが発生します。 それが解消されるということです。

ただ、個人的には Visual Studio のエラーメッセージと違い、英語になってしまうので、 それはそれでつらいかなとは思います。

Clang が広まる意義

前節のメリットを聞いても、そこまで「よし、 Clang に変えよう」と思う人は少ないかもしれません。 しかし、 Clang が広く使われるようになることの意義は単に C++ のコンパイラーの選択肢が増えるということに留まりません。

それは LLVM がコンパイラー基盤といって、これが実はかなり有益な仕組みであるためです。 Clang は正確にいうと LLVM のフロントエンドプログラムにあたります。 LLVM については上記の記事に説明を書いているので、 ここでは簡単に説明します。
LLVM では仮想マシン(VM)のようにソースの解析後、一旦中間コードにします。 それを LLVM が提供する機能を使って、 最適化実行ファイルの生成 を行います。

フロントエンドは最初のソースの解析から中間コードへの変換を主に担当し、 その C++ 用のものが Clang です。
vm_llvm.png



Clang がエラーメッセージがいくら分かりやすくなっているからといっても、 やはり gcc の最適化の能力と広く移植されている点はすごいものです。 gcc は多くの人が長い時間を書けて作っているのですから、それも当然です。

Clang も広く使われるようになり、開発が進んで、 gcc と同等の最適化や移植性もつことを想像してみてください。
Clang がその能力を持つということは LLVM で提供している最適化や移植性が同等になることを意味します。 新しい言語を作ろうと思った場合、一人で gcc ばりの最適化や移植は不可能です。 しかし、 LLVM では中間コードを生成するところまで作れば、 その能力を手にしたコンパイラーを作ることができます。

Microsoft や Google といった大企業や GNU のような大きなコミュニティーでなくてもいいわけですから、 一人のセンスのいいプログラマーがいれば、優れたコンパイラーをもった言語ができます。 素晴らしい言語が次々生まれる予感がして、 言語好きとしてはワクワクしてしまいます。

C++11, C++14 対応

そうしたわけで、 Clang はぜひ広まって欲しいと思っています。 ただ、「では自分は」というと、いろんなシガラミもあり、そうそうコンパイラーを変更することはできません。
しかし、 Clang はもう一つ大きな利点があります。 それは Clang がいち早く C++11, C++14 に対応した点です。 C++14 を一足先に試してみたいということで Clang を使ってみました。

C++ の言語仕様は長らくあまり変わっていなかったのですが、 C++11 で大きな機能追加があり、 C++14 でその補足的な機能追加がありました。
C++14 の 14 は 2014 年のことで、つい最近です。 C++11 の変更が大きく、他のコンパイラーがその対応もおぼつかない中、 C++14 の対応は異常だと感じるほどでした。

ただ、この利点はしばらくしたら、なくなってしまう利点です。 実際、 GCC も最近 5.1 で C++11 に完全対応し、実験的位置づけですが C++14 にも対応しました。
とはいえ C++17 など C++ の今後もっとよくなっていく気配を感じると Clang の対応の早さは期待が持てます。

因みに Visual Studio に関しては C++11 もまだまだという感じです。

gcc 互換か VS 互換か

Clang は gcc 互換を目標に開発されていますが、 同様に Visual Studio (Visual C++)互換も開発されています。

VS での C++ のコンパイルには内部で cl.exe を使用しています。 これと互換の clang-cl があります。
ただし、 clang-cl では C++11/14 への対応も cl に合わせているため、 C++14 対応の恩恵は得られません。


この記事では gcc 互換、 VS 互換の両方を解説していきます。

インストール

事前準備

gcc 互換 として使用する場合は MinGW (Windows 用 gcc) のインストールが必要です。
Clang は gcc を置き換えて使うようになっています。 Clang をインストールしてもコンパイラーと Clang 専用のヘッダー、ライブラリーがインストールされるだけで、 iostream のヘッダーすらインストールされません。 それらの基本ライブラリーは gcc のものを使うため、 MinGW のインストールが必要となります。

MinGW のインストールに関しては以前の記事を参考にして下さい。
なお、 インストール先のフォルダーはデフォルト(C:\MinGW)から変更してはダメです。 変更するとclang はヘッダー等を見つけられなくなります。 VS 互換 の場合には Visual Studio があらかじめインストールされている必要があります。

ダウンロード

LLVM のダウンロードサイトから Windows 用のバイナリーをダウンロードします。 lang_clang_dl.png

ダウンロードされるファイルは LLVM-X.X.0-win32.exe というインストーラーです。 clang ではなく LLVM という名前ですが、ちゃんと Clang がインストールされます。

インストール

インストーラーを実行するとウィザードが表示され、それに従えばインストールは完了します。

この際、実行ファイルの場所を環境変数 PATH に追加するかどうかの選択があるので、 ここは追加するようにしておきましょう。

lang_clang_inst.png

あと変えるとしたら、インストール先のパスぐらいではないでしょうか。

lang_clang_inst_path.png




なお、 VS をインストールしていないか、バージョンが古い(.NET 4.0 以上に対応していない)場合、 コンソールのエラーが出て止まります。 これは [Enter] を押せば、閉じて継続します。

lang_clang_vs.png

gcc 互換として利用する場合は関係ないので、特に気にする必要はありません。
後から VS 互換を使いたいといった場合は VS のインストール後、 (インストール先フォルダー)\tools\msbuild\instal.bat を実行して下さい。失敗したインストール処理を行います。

使い方

gcc 互換

gcc 互換の場合は、 gcc をそのまま置き換えれるようになっているので、 使い方は gcc と同じです。
各実行ファイルの対応は次の様になっています。

機能 GCC Clang
C コンパイラー gcc clang
C++ コンパイラー g++ clang++


例えば、 C++14 規格でコンパイルする場合は次のようになります。

hello.cpp :
#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;
    return 0;
}
~/lang/cpp $ clang++ -std=c++1y hello.cpp 
~/lang/cpp $ ./a.exe 
Hello world!
gcc の基本的な使い方についても MinGW の記事をご覧ください。 なお、 C++14 規格でコンパイルするためのオプションは正しくは -std=c++14 です。 しかし、このオプションをつけると clang++ から呼び出される g++ のエラーが発生します。
最初に GCC は C++14 に対応したと書きましたが、 MinGW の GCC のバージョンは少し遅れていて、 ちゃんと C++14 を試すためにはもう少し待つ必要があります。


ここでは基本的なコンパイルのやり方しか示しませんが、本格的なアプリを作る場合には Autogen のようなビルドツールを使うことになります。
Unix 系のビルドツールの場合は C コンパイラーは CC 、 C++ コンパイラーは CXX の変数で定義されていることが多いです。 その場合は CC=clang 、 CXX=clang++ という様に変更すれば、 Clang が使用されます。

VS 互換

VS 互換の場合は C++ のプロジェクトファイル(vcproj) のプロパティー画面を表示し、 [プラットホームツールセット] の項目で [LLVM-vs20XX] を選択します。

lang_clang_vs.png

この選択ができるようになっているのは、インストール時にツールセット用のファイルを作成したためです。 先ほど書いたコンソールのエラーは、この作成に失敗すると出ます。
ツールセットを設定し、プロジェクトをビルドすれば、コンパイルに clang-cl が使われるようになります。
ただし、 clang-cl の場合、 iostream のヘッダーをインクルードするとコンパイルエラーとなり、 Hello world すら作れません。 printf を使えば作れるのですが、 VS 互換に関してはまだまだといった感じです。


 
このページをシェア
アクセスカウンター
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

07月 | 2015年08月 | 09月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。