3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

埋め草 16進の文字'0'~'f'を剰余(%)を使って数値に変換する

Last updated at Posted at 2021-06-21

芒種

予想通り前回記事投稿から何もありませんでした。
「PMがPTA広報の部長になった訳だが」は取材(?)の為休載して埋め草記事でお茶を濁します。
今のところ紹介出来る持ちネタが4つあります。

  • 16進の文字'0'~'f'を数値に変換する
  • C++でJavaのsynchronized()を再現したい症候群
  • if~elseのネストを解決するJavaクラス
  • 生産性を上げる3種の神器 正規表現、RDBMS、スクリプト言語

アセンブラ/C/C++/Javaと辿ってきたのがモロバレですね。最近流行の言語は履修してません。

16進の文字'0'~'f'を数値に変換する

自分のアイデアでは無いので先に出典を紹介します。記憶が怪しいのですが「 ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか 」で読んだ気がします。

問題

16進数を表す文字('0'~'9', 'a'~'f')の文字コードが与えられた時、対応する16進数値(0~f)に変換する。

C/C++言語風の表現をすると以下のコードの内部実装を考えよ、上記以外の文字はバリデーションチェックで弾かれ入力されない為エラーチェックは不要、純粋な処理だけ考えなさい。
スマート(?)な実装ほど良しとします。尚、想定するスマートな実装は1行です。
というものです。

int f(char c) {
    // ここを考える。charからintへの型変換とか詳細は無視してOK
}

社内の同僚に問題を出してみた所、if文で文字判定して返値を求めるとか、
;で区切った後エディタ上で改行しなければ見た目は1行とか、

int f(char c) {
    return atoi(c);
}

等の回答が得られました。
atoi()の内部実装を問う設問なのでその回答は豪快過ぎます。笑

スマートな解

剰余演算(%)を使います。

int f(char c) {
    return  c % ('a' - 10) % '0';
}

これを見た時は目から鱗でした。
特定の条件を満たす時、自然数列上の任意個の、任意の区間を、自然数列にマッピング出来るという事です。
ちなみにこの問題における特定の条件とは
「出力値最大な'f'の返値 16 は、 入力値最小の'0'(=48)より小さい」
「'a'-10 (=97 -10 =87) は'9'(=57)より大きい」です。
'A'と大文字にしてしまうと'A'-10(=65 -10 = 55)は'9'(=57)より小さくなるので成立しなくなります。

次回予告

最近中学生の息子が買ったNintendo Switchの「はじめてゲームプログラミング」に親の私の方がドハマりして時間溶かしてます。

広報部運営が何もないと時間が取れてゲーム作成が捗るのですが、この記事本来の目的であるPTAのプロマネに関するネタが発生する事も期待しつつ、次回更新は少暑の頃を予定しています。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?