C言語ベース変換(フル)
バイナリに変換します。
10 進数から 2 進数へ (10➤2)
10 進数は、10 の余りを継続的に取得し、2 進数を左にシフトすることで 2 進数に変換できます。具体的な手順は次のとおりです。
1. 2 進数を格納する配列を定義します。
2. 配列の添字を記録する変数を定義します。
3. 10 が 0 になるまで、10 の余りをループします。
4. 剰余が求められるたびに、剰余は配列に格納されます。
5. 各剰余を求めた後、配列の添え字に 1 を加算します。
6. 最後に、配列を逆の順序で出力します。
コードは以下のように表示されます
#include <stdio.h>
int main()
{
int decimal, remainder, index = 0;
int binary[32];
printf("请输入一个十进制数:");
scanf("%d", &decimal);
while (decimal != 0)
{
remainder = decimal % 2;
binary[index] = remainder;
index++;
decimal /= 2;
}
printf("转换为二进制数为:");
for (int i = index - 1; i >= 0; i--)
{
printf("%d", binary[i]);
}
return 0;
}
16 進数から 2 進数へ (16➤2)
16 進数から 2 進数への変換は、switch 文と 16 進数のビット演算を使用して実現されます。具体的には、プログラムは入力 16 進数の各文字を調べ、文字の値に応じて対応する case タグを使用して、対応する 2 進数を出力に追加します。
コードは以下のように表示されます
#include <stdio.h>
int main() {
char hex[17];
int i = 0;
// 读入16进制数
printf("请输入16进制数:");
scanf("%s", hex);
printf("对应的2进制数为:");
while (hex[i]) {
switch (hex[i]) {
case '0':
printf("0000");
break;
case '1':
printf("0001");
break;
case '2':
printf("0010");
break;
case '3':
printf("0011");
break;
case '4':
printf("0100");
break;
case '5':
printf("0101");
break;
case '6':
printf("0110");
break;
case '7':
printf("0111");
break;
case '8':
printf("1000");
break;
case '9':
printf("1001");
break;
case 'A':
case 'a':
printf("1010");
break;
case 'B':
case 'b':
printf("1011");
break;
case 'C':
case 'c':
printf("1100");
break;
case 'D':
case 'd':
printf("1101");
break;
case 'E':
case 'e':
printf("1110");
break;
case 'F':
case 'f':
printf("1111");
break;
default:
printf("\n错误:无效的16进制数!\n");
return 0;
}
i++;
}
return 0;
}
プログラムの実行後、変換する 16 進数を入力すると、プログラムは対応する 2 進数を出力します。プログラムは大文字または小文字を含む 16 進数のみを処理できることに注意してください。入力文字列に他の文字が含まれている場合、プログラムは無効な 16 進数を入力するよう要求します。
8 進数から 2 進数へ (8➤2)
1. まず、ユーザーから 8 進数を取得します。
2. while ループでは、バイナリ変換プロセスをシミュレートします。
3. 反復ごとに、8 進数の最後の桁を rem 変数に格納します。
4. 次に、それをバイナリに変換し、binary_num 変数に追加します。
5. 基本変数は、2 進数の各桁を計算するために使用されます。
6. 最後に、生成された 2 進数を出力します。
コードは以下のように表示されます
#include <stdio.h>
int main() {
int octal_num, binary_num = 0, base = 1, rem;
printf("Enter an octal number: ");
scanf("%d", &octal_num);
while (octal_num > 0) {
rem = octal_num % 10;
binary_num += rem * base;
base *= 2;
octal_num /= 10;
}
printf("Binary number: %d", binary_num);
return 0;
}
16 進数に変換する
2進数から16進数へ(2➤16)
C 言語では、printf 関数とフォーマット文字列制御文字を使用して、2 進数から 16 進数への変換を実装できます。
コードは以下のように表示されます
#include <stdio.h>
int main()
{
int binary = 10101110; // 二进制数
int hex = 0; // 十六进制数
int i = 0;
while (binary != 0) {
// 将每四位二进制数转换为一个十六进制数
hex += (binary % 10) * (1 << i);
binary /= 10;
i += 4;
}
printf("0x%x", hex); // 输出十六进制数
return 0;
}
上記のコードでは、10101110 は 8 ビットの 2 進数で、2 進数の 4 桁ごとに 16 進数が対応します。ループでは、毎回下位 4 桁の 2 進数が取り出され、対応する 16 進数がシフト演算によって計算され、16 進変数に累積されます。最後に、%x 形式文字列制御文字を使用して 16 進数を出力します。出力結果は0xaeとなります。
8 進数から 16 進数へ (8➤16)
C 言語では、sprintf() 関数を使用して 8 進数を 16 進数に変換できます。
コードは以下のように表示されます
#include <stdio.h>
int main()
{
int octal = 037;
char hex[10];
sprintf(hex, "%X", octal);
printf("%o in octal is %s in hexadecimal.\n", octal, hex);
return 0;
}
出力は次のようになります。8 進数の 37 は 16 進数の 1F です。
10 進数から 16 進数へ (10➤16)
sprintf 関数を使用して 10 進数を 16 進数の文字列に変換し、printf 関数を使用して出力できます。
#include <stdio.h>
int main()
{
int dec = 336;
char hex[10];
sprintf(hex, "%X", dec); // 将十进制数转成十六进制字符串
printf("%s\n", hex); // 输出十六进制数
return 0;
}
注: sprintf 関数の最初のパラメータは、変換された文字列を配列に格納するため、ポインタではなく文字配列になります。sprintf 関数を使用する場合、ターゲットの文字配列が、変換された文字列を収容できる十分な大きさであることを確認する必要があります。この例では、ターゲット文字配列 16 進数のサイズは 10 で、これは任意の 32 ビット整数の 16 進表現を格納するには十分です。
8進数に変換
2進数から8進数へ(2➤8)
コードは以下のように表示されます
#include <stdio.h>
int main() {
long long binaryNumber;
int octalNumber = 0, decimalNumber = 0, i = 0;
printf("输入一个二进制数: ");
scanf("%lld", &binaryNumber);
// 将二进制转换为十进制
while (binaryNumber != 0) {
decimalNumber += (binaryNumber % 10) * pow(2, i);
++i;
binaryNumber /= 10;
}
i = 1;
// 将十进制转换为八进制
while (decimalNumber != 0) {
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
printf("转换为八进制数为: %d", octalNumber);
return 0;
}
このプログラムでは、2 つの while ループを使用しました。1 つは 2 進数を 10 進数に変換し、もう 1 つは 10 進数を 8 進数に変換します。最初の while ループでは、各ビットの数値に 2 の累乗を乗算して、2 進数を 10 進数に変換します。2 番目の while ループでは、各ビットの数値と 8 の累乗の積を計算することにより、10 進数を 8 進数に変換します。最後にprintf関数を使って8進数に変換した結果を出力します。
10 進数から 8 進数 (10➤8)
コードは以下のように表示されます
#include <stdio.h>
void DecimalToOctal(int decimalNumber)
{
int octalNumber = 0, i = 1;
// 从十进制数开始迭代
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
printf("转换后的八进制数为: %d", octalNumber);
}
int main()
{
int decimalNumber;
printf("请输入一个十进制数: ");
scanf("%d", &decimalNumber);
DecimalToOctal(decimalNumber);
return 0;
}
このプログラムは、入力として 10 進数を受け取り、while ループを使用してそれを 8 進数に変換し、最後に出力します。ユーザーが入力した 10 進数は、scanf 関数を通じてコンソールから読み取ることができます。
16 進数から 8 進数 (16➤8)
コードは以下のように表示されます
#include <stdio.h>
int main()
{
char hex_num[10], oct_num[10];
int i, j, k, digit;
long int dec_num = 0, octal_num = 0;
printf("Enter a hexadecimal number: ");
scanf("%s", hex_num);
// Converting hexadecimal to decimal
for(i = 0; hex_num[i] != '\0'; i++)
{
if(hex_num[i] >= '0' && hex_num[i] <= '9')
digit = hex_num[i] - '0';
else if(hex_num[i] >= 'A' && hex_num[i] <= 'F')
digit = hex_num[i] - 'A' + 10;
else if(hex_num[i] >= 'a' && hex_num[i] <= 'f')
digit = hex_num[i] - 'a' + 10;
dec_num = 16 * dec_num + digit;
}
// Converting decimal to octal
for(j = 0; dec_num != 0; j++)
{
oct_num[j] = dec_num % 8 + '0';
dec_num /= 8;
}
// Reversing the octal number
for(k = j - 1; k >= 0; k--)
{
octal_num = 10 * octal_num + (oct_num[k] - '0');
}
printf("The octal equivalent of %s is %ld.\n", hex_num, octal_num);
return 0;
}
プログラムは、まずユーザーから 16 進数を受け取り、それを整数 (10 進数) に変換し、次に 8 進数に変換して結果を出力します。このプログラムは、ループを使用して 16 進数の 10 進数値を計算し、別のループを使用してその 10 進数値の 8 進数値を計算します。最後に、プログラムは 8 進数を反転して結果を出力します。
例えば:
- 月曜~金曜 午後7時~午後9時
- 土曜午前9時~午前11時
- 日曜日 午後3時~午後6時
10進数に変換
2進数から10進数へ(2➤10)
C 言語の strtol() 関数を使用して、バイナリ文字列を 10 進数に変換できます。
long strtol(const char *nptr, char **endptr, int base);
このうち、nptr は変換対象の文字列を表し、endptr は変換完了後のポインタの位置を表し、base は変換後の数値の基数 (通常は 2、8、10、または 16) を表します。
コードは以下のように表示されます
#include <stdio.h>
#include <stdlib.h>
int main()
{
char binary[] = "10101";
char *endptr;
long decimal = strtol(binary, &endptr, 2);
printf("Binary: %s, Decimal: %ld\n", binary, decimal);
return 0;
}
8 進数から 10 進数へ (8➤10)
- 8 進変数には、入力された 8 進数が格納されます。
- 10 進数変数には変換された 10 進数が格納されます。
- i 変数は対応する電力値を計算するために使用され、pow() 関数は電力値を計算するために使用されます。
- その後、while ループ内で、各桁に対応する累乗を乗算する方法が変換に使用されます。
- 最後に結果を出力します。
コードは以下のように表示されます
#include <stdio.h>
#include <math.h>
int main() {
int octal, decimal = 0, i = 0;
printf("请输入一个八进制数:");
scanf("%o", &octal);
while (octal != 0) {
decimal += (octal % 10) * pow(8, i);
++i;
octal /= 10;
}
printf("八进制数 %o 转换为十进制数为 %d", octal, decimal);
return 0;
}
16 進数から 10 進数へ (16➤10)
C 言語の strtol 関数を使用すると、16 進数の文字列を 10 進数に変換できます。
long int strtol(const char *str, char **endptr, int base);
このうち、最初のパラメータ str は変換する必要がある文字列、2 番目のパラメータ endptr は変換後の未処理部分を格納する文字ポインタへのポインタ、3 番目のパラメータ Base は変換後の数値の基数です。 16 は 16 進数を表すために使用されます。
コードは以下のように表示されます
#include <stdio.h>
#include <stdlib.h>
int main() {
char hex[] = "1A"; // 十六进制字符串
long int dec = strtol(hex, NULL, 16); // 转换为十进制数
printf("%ld\n", dec); // 输出十进制数
return 0;
}