5
4

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 5 years have passed since last update.

今日見た凄いと思ったコード

Last updated at Posted at 2019-09-29

文字列の16進数を値の10進数に変換

hex2dec.c
#include <stdio.h>

int hex2dec(int hex)
{
    return hex % 87 % 48;
}

int main(void)
{
    char input;
    scanf("%s", &input);

    printf("%d\n", hex2dec(input));
}
input(文字列を入力)
9
output(数値が出力)
9
input(文字列を入力)
f
output(数値が出力)
15

なんでこうなるのか

そもそも87や48はどっから出てきたのか。

自分なりの解釈

48ってなんやねん

10進数の48は文字コードで0であり、それで割った余りが値としての数値が出てきた。
0から9まではこの処理で大丈夫

じゃあ87は?

10進数の87は文字コードでW。なんの関係もなかった

置きかえよう

87を10進数として16進数で表記した場合、57となった
57を10進数で表した場合、文字コードで9であった

つまり……どういうことだってばよ?

57:文字コードで「9」
87:10進数を16進数として、この値で割った余りがa~fの値としての数値となる
よって、10~15が出力される

まとめ

48:文字コードで「0」
87:文字コードで「9」を16進数に変換した57を、更に10進数に変換した値

上2つの値で割った余りが値としての16進数に変換される
手計算でもこうなるのは確認したけど、なんでこうなるのかは全くわからん。誰か教えて……

参照

ASCIIコード表
http://www3.nit.ac.jp/~tamura/ex2/ascii.html

2進数、8進数、10進数、16進数相互変換ツール
https://hogehoge.tk/tool/number.html

5
4
4

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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?