様々な言語で基数変換する（C,C#,Java,Javascript,Ruby,MySQL）

# はじめに

RGBのカラーコードを10進数から16進数に変換する処理など、業務で稀に基数変換の処理を書くことがありますが、稀にしか使わない処理なのでいざ使う時には書き方をすっかり忘れてしまっています。
そこで以下の記事と同じ要領で、様々な言語で基数変換をする処理をまとめてみました。

https://qiita.com/nkojima/items/09e7b37cbca40d797bcf

# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタを使いました。

# C言語

* 基数変換する関数が無いらしいので、10進数→N進数に変換するための処理を自作しました。
  * 以下のコードは、`radix`の値を変更することでN進数に変換できますが、対応しているのは10進数以下となります。
  * @SaitoAtsushi さん、ご指摘ありがとうございました。

```c:10進数→N進数の変換
#include <stdio.h>

// 変換後の基数
const int radix = 2;

int main(void){
    int decimalNumber = 100;
    printf("10進数の値: %d\n", decimalNumber);
    
    int converted = 0;  // 変換後の値
    int base = 1;
    
    while (decimalNumber>0) {
        int mod = decimalNumber % radix;
        converted = converted + (mod * base);
        decimalNumber = decimalNumber / radix;
        base = base * 10;
    }
    
    printf("10進数->%d進数に変換: %d\n", radix, converted);
}
```

```text:実行結果（10進数→N進数の変換）
10進数の値: 100
10進数->2進数に変換: 1100100
```

* N進数→10進数の変換については、`strtol`関数を使うと36進数以下であれば変換できるようです。
  * @SaitoAtsushi さん、ご教示頂きありがとうございました。

```c:N進数→10進数の変換
#include <stdio.h>
#include <stdlib.h>

// 変換後の基数
const int radix = 16;

int main(void){
     const char* decimalNumber = "FF";
     long converted = strtol(decimalNumber, NULL, radix);     
     printf("%d進数の%sを10進数で表すと: %d\n", radix, decimalNumber, converted);
}
```

```text:実行結果（2進数→10進数の変換）
16進数のFFを10進数で表すと: 255
```


# C#

* 10進数→N進数の変換は、`Convert.ToString(元の値, 変更後の基数)`で簡単に基数変換できます。

```c#:10進数→N進数の変換
using System;

public class Hello{
    public static void Main(){
        int decimalNumber = 100;
        System.Console.WriteLine("10進数の値: " + decimalNumber);
        System.Console.WriteLine("10進数->2進数に変換: " + Convert.ToString(decimalNumber, 2));
        System.Console.WriteLine("10進数->8進数に変換: " + Convert.ToString(decimalNumber, 8));
        System.Console.WriteLine("10進数->16進数に変換: " + Convert.ToString(decimalNumber, 16));
    }
}
```

```text:実行結果（10進数→N進数の変換）
10進数の値: 100
10進数->2進数に変換: 1100100
10進数->8進数に変換: 144
10進数->16進数に変換: 64
```

* N進数→10進数の変換は、`Convert.ToInt32(元の値, 変更後の基数)`で簡単に基数変換できます。

```c#:N進数→10進数の変換
using System;

public class Hello{
    public static void Main(){
        System.Console.WriteLine("2進数->10進数に変換: " + Convert.ToInt32("1100100", 2));
        System.Console.WriteLine("8進数->10進数に変換: " + Convert.ToInt32("144", 8));
        System.Console.WriteLine("16進数->10進数に変換: " + Convert.ToInt32("64", 16));
    }
}
```

```text:実行結果（N進数→10進数の変換）
2進数->10進数に変換: 100
8進数->10進数に変換: 100
16進数->10進数に変換: 100
```


# Java

* 10進数→N進数の変換はC#と似ていますが、ConvertクラスではなくIntegerクラスのtoStringメソッドを使います。

```java:10進数→N進数の変換
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int decimalValue = 100;
        System.out.println("10進数の値: " + decimalValue);
        System.out.println("10進数->2進数に変換: " + Integer.toString(decimalValue, 2));
        System.out.println("10進数->8進数に変換: " + Integer.toString(decimalValue, 8));
        System.out.println("10進数->16進数に変換: " + Integer.toString(decimalValue, 16));
    }
}
```

```text:実行結果（10進数→N進数の変換）
10進数の値: 100
10進数->2進数に変換: 1100100
10進数->8進数に変換: 144
10進数->16進数に変換: 64
```

* N進数→10進数の変換は、`Integer.parseInt(元の値, 変更後の基数)`で簡単に基数変換できます。

```java:N進数→10進数の変換
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("2進数->10進数に変換: " + Integer.parseInt("1100100", 2));
        System.out.println("8進数->10進数に変換: " + Integer.parseInt("144", 8));
        System.out.println("16進数->10進数に変換: " + Integer.parseInt("64", 16));
    }
}
```


# Javascript

* 10進数→N進数の変換は`toString`メソッドを使います。
  * メソッド名はJavaと同じです。

```javascript:10進数→N進数の変換
let decimalValue = 100;
console.log("10進数の値: " + decimalValue);
console.log("10進数->2進数に変換: " + decimalValue.toString(2));
console.log("10進数->8進数に変換: " + decimalValue.toString(8));
console.log("10進数->16進数に変換: " + decimalValue.toString(16));
```

```text:実行結果（10進数→N進数の変換）
10進数の値: 100
10進数->2進数に変換: 1100100
10進数->8進数に変換: 144
10進数->16進数に変換: 64
```

* N進数→10進数の変換は、`parseInt(元の値, 変更後の基数)`で簡単に基数変換できます。
  * こちらもメソッド名はJavaと同じですね...

```javascript:N進数→10進数の変換
console.log("2進数->10進数に変換: " + parseInt('1100100', 2));
console.log("8進数->10進数に変換: " + parseInt('144', 8));
console.log("16進数->10進数に変換: " + parseInt('64', 16));
```

```text:実行結果（N進数→10進数の変換）
2進数->10進数に変換: 100
8進数->10進数に変換: 100
16進数->10進数に変換: 100
```

# Ruby

* 10進数→N進数の変換は、`to_s(変換後の基数)`で変換できます。

```ruby:10進数→N進数の変換
decimalValue = 100
puts "10進数->2進数に変換: " + decimalValue.to_s(2)
puts "10進数->8進数に変換: " + decimalValue.to_s(8)
puts "10進数->16進数に変換: " + decimalValue.to_s(16)
```

```text:実行結果（10進数→N進数の変換）
10進数->2進数に変換: 1100100
10進数->8進数に変換: 144
10進数->16進数に変換: 64
```

* N進数→10進数の変換は、`to_i(変更後の基数)`で簡単に基数変換できます。

```ruby:N進数→10進数の変換
puts "2進数->10進数に変換: " + ("1100100".to_i(2)).to_s
puts "8進数->10進数に変換: " + ("144".to_i(8)).to_s
puts "16進数->10進数に変換: " + ("64".to_i(16)).to_s
```

```text:実行結果（N進数→10進数の変換）
2進数->10進数に変換: 100
8進数->10進数に変換: 100
16進数->10進数に変換: 100
```

# MySQL

* MySQLで10進数→N進数の変換は、`BIN` `OCT` `HEX` という関数で簡単にできます。

```sql:10進数→N進数の変換
SELECT CONCAT('10進数->2進数に変換: ', BIN(100));
SELECT CONCAT('10進数->8進数に変換: ', OCT(100));
SELECT CONCAT('10進数->16進数に変換: ', HEX(100));
```

```text:実行結果（10進数→N進数の変換）
CONCAT('10進数->2進数に変換: ', BIN(100))
10進数->2進数に変換: 1100100
CONCAT('10進数->8進数に変換: ', OCT(100))
10進数->8進数に変換: 144
CONCAT('10進数->16進数に変換: ', HEX(100))
10進数->16進数に変換: 64
```

* N進数→10進数への変換は、`CONV`関数を使います。
  * `CONV(変換する値, 変換前の基数, 変換後の基数)`という形で引数を設定します。

```sql:N進数→10進数の変換
SELECT CONCAT('2進数->10進数に変換: ', CONV(1100100, 2, 10));
SELECT CONCAT('8進数->10進数に変換: ', CONV('144', 8, 10));
SELECT CONCAT('16進数->10進数に変換: ', CONV('64', 16, 10));
```

```text:実行結果（N進数→10進数の変換）
CONCAT('2進数->10進数に変換: ', CONV(1100100, 2, 10))
2進数->10進数に変換: 100
CONCAT('8進数->10進数に変換: ', CONV('144', 8, 10))
8進数->10進数に変換: 100
CONCAT('16進数->10進数に変換: ', CONV('64', 16, 10))
16進数->10進数に変換: 100
```


# 参考URL

* C言語
  * [10進数を2進数に変換](https://webkaru.net/clang/decimal-to-binary/)
  * [STRTOL](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtol.3.html)
  * [strtol](http://www9.plala.or.jp/sgwr-t/lib/strtol.html)
* C#
  * [数値を16進数 8進数 2進数表記の文字列に変換する (C#プログラミング)](https://www.ipentec.com/document/csharp-convert-2-8-16-decimal)
  * [16進数、8進数、2進数の文字列を整数に変換する](https://dobon.net/vb/dotnet/programing/converthex.html)
* Java
  * [Javaで基数変換（10進数からn進数、n進数から10進数）](https://lovedvoraklayout.hatenablog.com/entry/base-conversion)
  * [２進数、８進数、１６進数を扱う](https://java-reference.com/java_number_hexa.html)
* Javascript
  * [数値を指定の基数の形式で文字列に変換する(toString)](https://www.javadrive.jp/javascript/number/index2.html)
  * [JavaScriptで２進数などを１０進数に変換する方法まとめ](https://pisuke-code.com/js-convert-bin-oct-hex-to-dec/)
* Ruby
  * [Rubyで文字列と数値を相互変換する(2進、8進、10進、16進数)](https://www.xmisao.com/2014/08/25/ruby-convert-string-and-integer.html)
* MySQL
  * [MySQLで10進数を2・8・16進数に変換](https://k-sugi.sakura.ne.jp/mysql/5722/)