ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

Javaの16進数から10進数への変換についてのメモ

負の数(2の補数)を考慮した場合の16進数から10進数への変換について、 なかなか求めている情報が出てこない(なかった)のでここにメモ。

やりたかったこと

16進数で負の数(2の補数)を考慮した値を考えるには、 2進数表記で桁数を何桁に設定するのかってのが大事になります。 (大学や情報技術者試験の勉強でそう学んだ)

その桁数を可変にできるようにしたかった。

結果

そういうライブラリとかあるかなって思ったのだが、
うまく見つけることができませんでした。検索で引っかかるサイトは以下

苦肉の策として2つ目と3つ目のサイトの合わせ技をしました。 2つ目のサイトで

    int n1 = Integer.parseInt(arg, 16);
    int n2 = (byte)Integer.parseInt(arg, 16);

という部分に"FE"を代入すると、 n1は254,n2は-2となる理屈を考えます。
それは型の最大桁数に起因するものです。

つまりInteger.parseInt(arg, 16)をbyteにキャストすると、 8ビット(16進数で2桁)の2の補数で処理されるのです。

ということで、byte以外の型でキャストすれば、桁数を(自由自在ではありませんが)変更することができます。

    // 8ビットの2の補数/16進数で2桁の2の補数として処理したい場合
    int n1 = (byte)Long.parseLong("16進数文字列", 16);

 // 16ビットの2の補数/16進数で4桁の2の補数として処理したい場合
    int n2 = (short)Long.parseLong("16進数文字列", 16);

    // 32ビットの2の補数/16進数で8桁の2の補数として処理したい場合
    int n3 = (int)Long.parseLong("16進数文字列", 16);

一度大きな枠組みの型にしてからキャストする必要があるので、
3つ目のサイト内のように変換はLong.parseLong()を用います。 受け取る型は、キャストした型かそれよりも大きい型だったら大丈夫なはずです(厳密に確認できていない)
もちろん今回の方法ではJavaに用意されていない型(ビット数)では処理をすることができません。。。

終わりに

調べきれなかっただけで便利なライブラリはあるのかもしれません。
(知っているという方は、後学のために是非とも教えていただきたい)