C语言中各进制之间的转换

在C语言中,进行不同进制之间的转换通常涉及将数字从一种表示形式转换为另一种表示形式。以下是一些常见的进制转换方法:

直接转进制输出

1. 十进制到其他进制

  • 二进制:使用 printf 函数的 %d 格式说明符,或者使用位操作。
  • 八进制:使用 printf 函数的 %o 格式说明符。
  • 十六进制:使用 printf 函数的 %x%X 格式说明符。
#include <stdio.h>

int main() {
    int decimal = 255;
    printf("Decimal to binary: %d in binary is %b\n", decimal, decimal);
    printf("Decimal to octal: %d in octal is %o\n", decimal, decimal);
    printf("Decimal to hexadecimal: %d in hexadecimal is %x\n", decimal, decimal);
    return 0;
}

2. 其他进制到十进制

  • 二进制:使用 printf 函数的 %d 格式说明符,或者使用位操作。
  • 八进制:使用 printf 函数的 %d 格式说明符。
  • 十六进制:使用 printf 函数的 %d 格式说明符。
#include <stdio.h>

int main() {
    int binary = 0b11111111; // 二进制表示
    int octal = 0377; // 八进制表示
    int hex = 0xFF; // 十六进制表示

    printf("Binary to decimal: %b in decimal is %d\n", binary, binary);
    printf("Octal to decimal: %o in decimal is %d\n", octal, octal);
    printf("Hexadecimal to decimal: %x in decimal is %d\n", hex, hex);
    return 0;
}

3. 其他进制之间的转换

  • 二进制到八进制:可以将二进制数分组为每组三位,然后转换为对应的八进制数。
  • 二进制到十六进制:可以将二进制数分组为每组四位,然后转换为对应的十六进制数。
  • 八进制到二进制:可以将八进制数的每一位转换为对应的三位二进制数。
  • 八进制到十六进制:可以将八进制数分组为每组两位,然后转换为对应的十六进制数。
  • 十六进制到二进制:可以将十六进制数的每一位转换为对应的四位二进制数。
  • 十六进制到八进制:可以将十六进制数分组为每组四位,然后转换为对应的八进制数。

常见进制之间的转换

二进制到十进制
int binaryToDecimal(int binary, int *decimal) {
    *decimal = 0;
    while (binary > 0) {
        *decimal = (*decimal << 1) | (binary & 1);
        binary >>= 1;
    }
    return *decimal;
}
十进制到二进制
void decimalToBinary(int decimal, int *binary) {
    int index = 0;
    while (decimal > 0) {
        binary[index++] = decimal % 2;
        decimal /= 2;
    }
    // 如果需要,可以反转数组
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        int temp = binary[i];
        binary[i] = binary[j];
        binary[j] = temp;
    }
}
十进制到八进制
void decimalToOctal(int decimal, int *octal) {
    int index = 0;
    while (decimal > 0) {
        octal[index++] = decimal % 8;
        decimal /= 8;
    }
    // 如果需要,可以反转数组
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        int temp = octal[i];
        octal[i] = octal[j];
        octal[j] = temp;
    }
}
十进制到十六进制
void decimalToHexadecimal(int decimal, int *hexadecimal) {
    int index = 0;
    char hexDigits[] = "0123456789ABCDEF";
    while (decimal > 0) {
        hexadecimal[index++] = hexDigits[decimal % 16];
        decimal /= 16;
    }
    // 如果需要,可以反转数组
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        int temp = hexadecimal[i];
        hexadecimal[i] = hexadecimal[j];
        hexadecimal[j] = temp;
    }
}

这些函数将十进制数转换为其他进制,并将结果存储在整数数组中。你可以根据需要调用这些函数,并将结果存储在数组中。如果你需要将结果转换回十进制,你可以使用类似的方法来实现。

请注意,这些函数假设输入的十进制数是正数,并且没有进行错误检查。在实际应用中,你可能需要添加更多的错误检查和处理逻辑。

 

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个实现任意进制之间互相转换的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 将一个任意进制转换为十进制数 int anyBaseToDecimal(char* num, int base) { int result = 0; int i = 0; int len = strlen(num); // 按权展开法 for (i = 0; i < len; i++) { int digit; if (num[i] >= '0' && num[i] <= '9') { digit = num[i] - '0'; } else if (num[i] >= 'A' && num[i] <= 'Z') { digit = num[i] - 'A' + 10; // A~Z表示的数字 } else { printf("Invalid input!\n"); // 非法输入 return 0; } result = result * base + digit; } return result; } // 将一个十进制转换为任意进制数 char* decimalToAnyBase(int num, int base) { int quotient = num; int remainder; char* result = (char*) malloc(32 * sizeof(char)); // 分配足够的内存空间,最多支持32位进制数 char* buffer = (char*) malloc(32 * sizeof(char)); int i = 0; // 除基取余法 while (quotient != 0) { remainder = quotient % base; quotient = quotient / base; if (remainder < 10) { buffer[i++] = remainder + '0'; } else { buffer[i++] = remainder - 10 + 'A'; // 大于等于10时,使用A~Z表示 } } int j = 0; // 反转字符串 for (j = 0; j < i; j++) { result[j] = buffer[i-j-1]; } result[j] = '\0'; // 字符串结尾需要加上'\0' free(buffer); // 释放内存空间 return result; } // 将一个任意进制转换为另一个任意进制数 char* anyBaseToAnyBase(char* num, int from, int to) { int decimal = anyBaseToDecimal(num, from); // 先将任意进制转换为十进制数 char* result = decimalToAnyBase(decimal, to); // 再将十进制转换为目标进制数 return result; } int main() { char* num = "12345"; int from = 10; // 数字是10进制 int to = 16; // 转换为16进制 char* result = anyBaseToAnyBase(num, from, to); printf("%s in base %d: %s in base %d\n", num, from, result, to); free(result); // 释放内存空间 return 0; } ``` 以上代码可以将一个任意进制转换为另一个任意进制数。你可以根据自己的需要来修改进制数和测试数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值