慣れるまで大変！基数変換

# はじめまして
最近IT業界に転職しました完全未経験な私です。
どうか温かい目で見守っていただけると幸いです。
私が資格取得に向けて学習をしている
基本情報技術者試験の基数変換について
私自身のアウトプットを目的とした内容を書いていきます。

# 進数
私たちが日常使っているものは**10進数**といいます
10進数は0から9までの10種類の数字を使って**9の次が一つ桁上がりします**
　　　９
＋　　１
   　　１０　　←9の次が一つ桁上がる

ほかの進数の考え方は一緒！
**2進数**・・・0と1の2種類の数字を使って1の次が桁上がり
**8進数**・・・0から7の8種類の文字を使って7の次が桁上がり
**16進数**・・・0から9までの数字とAからFを使ってFの次が桁上がり
　　　 F
＋　　１
　　１０

種類が多く覚えることが大変です...
↓一覧表を載せておきますので覚えるまで見ながらやるのがいいかもしれません

![decimal-notation-hyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828164/190a6f12-404d-de5a-b447-bab37d491f58.png)
添付画像引用元↓
https://spi練習問題.com/category/n%E9%80%B2%E6%B3%95/

# 基数
基数とは**各桁の重みづけの基本となる数**と言われています。
10進数では一の位が10⁰、十の位は10¹、百の位は10²・・・と10が基本になっている
※桁の重みとは各桁の単位のこと

**N進数の重み**
小数点を基準に左→N⁰、N¹、N²・・・
小数点を基準に右→N⁻¹、N⁻²、N⁻³・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828164/3e2f682b-0cd9-451b-eaa9-2863714d251b.png)
添付画像引用元↓
https://math-room.hatenablog.com/entry/math01/14/02


この公式を頭に入れておく。
学生の時に数学（算数？）で教わりました…懐かしい…


# N進数から10進数へ基数変換

**基数変換**とは？？
→ある進数で表現された数値を別の進数で表現すること！

まず一個頭にまた入れることは
**N進数から10進数**に変換の場合**各桁の重みと数値を掛けて結果を合計**

ややこしいですね

例えば
2進数101.101を10進数に変換したい場合
101 →1×2²＋0×2¹＋1×2⁰＝1×4＋0×2＋1×1=4＋1=5
.101→1×2⁻³＋0×2⁻²＋1×2⁻¹＝1×0.125＋0×0.25＋1×0.5=0.625

5＋0.625＝5.625　　となりこちらが答えになります。
8進数、16進数も考え方は同じです

# 10進数からN進数へ基数変換
本来２通りのも求め方があるのですが今回は初心者に優しいといわれている方法を載せていきたいと思います

**割り算と掛け算を使う方法**
例：10進数38.625を2進数で求める場合

整数部の38と小数部の0.625に分けて求めていきます

**整数部の38を2進数で表すには2で割っていき余りの数を下から上に並べて**いきます。
38÷2＝19…0
19÷2＝9……1
9÷2＝ 4……１
4÷2＝ 2……0
2÷2＝ 1……0
1÷2＝ 0……1

商が0になるまで繰り返します。
10進数38の2進数は**100110**になりました

**小数部を2進数で表すには2を掛けて整数部を順に並べて**いきます
0.625×2＝1.25
(小数部のみを引き継いでいく)
↓
0.25×2＝  0.5
0.5×2＝　1.0
小数部分が0になるまで繰り返します。
10進数0.625の2進数は**101**となります。
最後に整数部と小数部を合わせて**100110.101**になります！

# 2進数から8進数へ基数変換
これは少し楽にできます！！

方法としては**小数点を基準に2進数を3桁に区切り分け、各ブロックを8進数に直します**
(足りない分は0で補う)

例　2進数1100.01を8進数で表す
001
　　→0×2²＋0×2¹＋1×2⁰＝1
100
　　→1×2²＋0×2¹＋0×2⁰＝4
.010
　　→0×2²＋1×2¹＋0×2⁰＝2

したがって2進数1100.01を8進数で表すと**14.2**となる

# 2進数から16進数へ基数変換
こちらも先ほどとやり方はほとんど一緒！区切る数が違うだけ！

方法としては**小数点を基準に2進数を4桁に区切り分け、各ブロックを16進数に直す**
(足りない分は0で補う)

例　2進数1100.01を16進数で表す

1100
　　→1×2³＋1×2²＋0×2¹＋0×2⁰＝12→C
  　　(16進数は12ではなくCになることを忘れずに！)
.0100
　　→0×2³＋1×2²＋0×2¹＋0×2⁰＝4

したがって2進数1100.01を16進数で表すと**C.4**となる

# 8進数から2進数へ基数変換
こちらは今までやってきたことの逆を行っていきます
方法としては**8進数の1桁を2進数3桁に直す**

例　8進数63.5を2進数へ

6 →0＋4＋2＝1×2²＋1×2¹＋0×2⁰＝110
3 →0＋2＋1＝0×2²＋1×2²＋1×2¹＝011
5 →4＋0＋1＝1×2²＋0×2²＋1×2¹＝101

したがって8進数63.5を2進数に表すと**110011.101**となります

# 16進数から2進数へ基数変換
ここまでやってくればなんとなくやることはわかってきたはず

方法 **16進数の1桁を2進数4桁に直す**

例　16進数D4.Cを2進数で表す

D →13(これは10進数の値)→8+4+0+1＝1×2³+1×2²+0×2¹+1×2⁰＝1101
4 →0+4+0+0＝0×2³+1×2²+0×2¹+0×2⁰＝0100
C →12(10進数の値)→8+4+0+0＝1×2³＋1×2²＋0×2¹＋0×2⁰＝1100

したがって16進数D4.Cを2進数で表すと**11010100．1100**となります

# おつかれさまでした
16進数を2進数に変える際途中10進数を挟むと間違い少なく解けそうです

長々とありがとうございました。
書き始め投稿することでアウトプットできるのか不安があったのですがただ黙々と独学するより身についた気がします。


参考文書↓

https://www.bing.com/ck/a?!&&p=6d2aa83b5a5815adJmltdHM9MTcxOTc5MjAwMCZpZ3VpZD0zOWY1ZGExNi1hOWU4LTY5YWMtMWY2OC1jODE3YTgwMjY4MmEmaW5zaWQ9NTMyMg&ptn=3&ver=2&hsh=3&fclid=39f5da16-a9e8-69ac-1f68-c817a802682a&psq=%e3%81%8b%e3%82%84%e3%81%ae%e3%81%8d%e5%85%88%e7%94%9f&u=a1aHR0cHM6Ly93d3cuYW1hem9uLmNvLmpwLyVFNCVCQiVBNCVFNSU5MiU4QzA2JUU1JUI5JUI0LSVFMyU4MiVBNCVFMyU4MyVBMSVFMyU4MyVCQyVFMyU4MiVCOCVFRiVCQyU4NiVFMyU4MiVBRiVFMyU4MyVBQyVFMyU4MyU5MCVFMyU4MyVCQyVFNiU5NiVCOSVFNSVCQyU4RiVFMyU4MSVBNyVFMyU4MiU4OCVFMyU4MSU4RiVFMyU4MiU4RiVFMyU4MSU4QiVFMyU4MiU4Qi0lRTMlODElOEIlRTMlODIlODQlRTMlODElQUUlRTMlODElOEQlRTUlODUlODglRTclOTQlOUYlRTMlODElQUUlRTUlOUYlQkElRTYlOUMlQUMlRTYlODMlODUlRTUlQTAlQjElRTYlOEElODAlRTglQTElOTMlRTglODAlODUlRTYlOTUlOTklRTUlQUUlQTQtJUU2JUEwJUEyJUU2JTlDJUE4LSVFNSU4RSU5QS9kcC80Mjk3MTM4Mjcx&ntb=1

参考動画↓

https://youtu.be/oqaBEnhIxk0?si=5J5c1g8AfHkpidvr