• 如何在 C 语言中处理不同进制的数字表示?


    C语言

    🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
    📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。

    分割线

    分割线


    C 语言中处理不同进制的数字表示

    在 C 语言中,我们经常需要处理不同进制的数字表示,如二进制、八进制、十进制和十六进制。了解如何在 C 语言中处理这些不同进制的数字对于编写高效和灵活的程序非常重要。

    一、十进制

    十进制是我们日常生活中最常用的进制,其基数为 10,数字由 0 - 9 组成。在 C 语言中,默认情况下整数常量是十进制的。

    例如:

    int num_decimal = 123;
    

    在上述代码中,123 就是一个十进制数。

    二、二进制

    二进制是计算机中最基本的进制,其基数为 2,数字只有 0 和 1 组成。在 C 语言中,要表示二进制数字,需要使用特定的前缀。

    0b0B 作为前缀来表示二进制数。

    例如:

    int num_binary = 0b1010;  // 相当于十进制的 10
    

    三、八进制

    八进制的基数为 8,数字由 0 - 7 组成。在 C 语言中,以数字 0 作为前缀来表示八进制数

    例如:

    int num_octal = 012;  // 相当于十进制的 10
    

    四、十六进制

    十六进制的基数为 16,数字由 0 - 9 和 A - F(或 a - f)组成,其中 A - F 表示 10 - 15。在 C 语言中,以 0x0X 作为前缀来表示十六进制数。

    例如:

    int num_hex = 0xA;  // 相当于十进制的 10
    

    五、不同进制之间的转换

    (一) 十进制转其他进制

    我们可以使用除法和取余的方法将十进制数转换为其他进制。以下是将十进制转换为二进制、八进制和十六进制的示例代码:

    #include 
    
    void decimalToBinary(int decimal) {
        int binary[32];
        int index = 0;
    
        while (decimal > 0) {
            binary[index++] = decimal % 2;
            decimal /= 2;
        }
    
        for (int i = index - 1; i >= 0; i--) {
            printf("%d", binary[i]);
        }
        printf("\n");
    }
    
    void decimalToOctal(int decimal) {
        int octal[32];
        int index = 0;
    
        while (decimal > 0) {
            octal[index++] = decimal % 8;
            decimal /= 8;
        }
    
        for (int i = index - 1; i >= 0; i--) {
            printf("%d", octal[i]);
        }
        printf("\n");
    }
    
    void decimalToHexadecimal(int decimal) {
        char hexadecimal[32];
        int index = 0;
    
        while (decimal > 0) {
            int remainder = decimal % 16;
            if (remainder < 10) {
                hexadecimal[index++] = remainder + '0';
            } else {
                hexadecimal[index++] = remainder - 10 + 'A';
            }
            decimal /= 16;
        }
    
        for (int i = index - 1; i >= 0; i--) {
            printf("%c", hexadecimal[i]);
        }
        printf("\n");
    }
    
    int main() {
        int decimal = 255;
    
        printf("Decimal: %d\n", decimal);
    
        printf("Binary: ");
        decimalToBinary(decimal);
    
        printf("Octal: ");
        decimalToOctal(decimal);
    
        printf("Hexadecimal: ");
        decimalToHexadecimal(decimal);
    
        return 0;
    }
    

    在上述代码中,我们分别定义了三个函数 decimalToBinarydecimalToOctaldecimalToHexadecimal 来将十进制数转换为二进制、八进制和十六进制,并在 main 函数中进行调用和输出。

    (二) 其他进制转十进制

    要将其他进制的数转换为十进制,可以使用位权的概念。位权是指一个数字在不同位置上的权重,例如在二进制中,从右往左第 i 位的位权是 2^(i - 1);在八进制中,从右往左第 i 位的位权是 8^(i - 1);在十六进制中,从右往左第 i 位的位权是 16^(i - 1)

    以下是将二进制、八进制和十六进制转换为十进制的示例代码:

    #include 
    
    int binaryToDecimal(int binary) {
        int decimal = 0;
        int base = 1;
    
        while (binary > 0) {
            int remainder = binary % 10;
            decimal += remainder * base;
            base *= 2;
            binary /= 10;
        }
    
        return decimal;
    }
    
    int octalToDecimal(int octal) {
        int decimal = 0;
        int base = 1;
    
        while (octal > 0) {
            int remainder = octal % 10;
            decimal += remainder * base;
            base *= 8;
            octal /= 10;
        }
    
        return decimal;
    }
    
    int hexadecimalToDecimal(char *hexadecimal) {
        int decimal = 0;
        int base = 1;
        int length = strlen(hexadecimal);
    
        for (int i = length - 1; i >= 0; i--) {
            int digit;
            if (hexadecimal[i] >= '0' && hexadecimal[i] <= '9') {
                digit = hexadecimal[i] - '0';
            } else if (hexadecimal[i] >= 'A' && hexadecimal[i] <= 'F') {
                digit = hexadecimal[i] - 'A' + 10;
            } else if (hexadecimal[i] >= 'a' && hexadecimal[i] <= 'f') {
                digit = hexadecimal[i] - 'a' + 10;
            }
    
            decimal += digit * base;
            base *= 16;
        }
    
        return decimal;
    }
    
    int main() {
        int binary = 1010;
        int octal = 25;
        char hexadecimal[] = "1F";
    
        printf("Binary: %d\n", binary);
        printf("Decimal: %d\n", binaryToDecimal(binary));
    
        printf("Octal: %d\n", octal);
        printf("Decimal: %d\n", octalToDecimal(octal));
    
        printf("Hexadecimal: %s\n", hexadecimal);
        printf("Decimal: %d\n", hexadecimalToDecimal(hexadecimal));
    
        return 0;
    }
    

    在上述代码中,我们分别定义了三个函数 binaryToDecimaloctalToDecimalhexadecimalToDecimal 来将二进制、八进制和十六进制转换为十进制,并在 main 函数中进行调用和输出。

    六、输出不同进制的数字

    (一) 使用 printf 函数

    在 C 语言中,可以使用 printf 函数来输出不同进制的数字。

    • 输出二进制:C 语言标准的 printf 函数没有直接输出二进制的格式控制符。但我们可以通过位操作和循环来实现。
    #include 
    
    void printBinary(int num) {
        for (int i = sizeof(int) * 8 - 1; i >= 0; i--) {
            (num & (1 << i))? printf("1") : printf("0");
        }
        printf("\n");
    }
    
    int main() {
        int num = 10;
        printf("Decimal: %d\n", num);
        printf("Binary: ");
        printBinary(num);
        return 0;
    }
    
    • 输出八进制:使用 %o 格式控制符。
    #include 
    
    int main() {
        int num = 10;
        printf("Decimal: %d\n", num);
        printf("Octal: %o\n", num);
        return 0;
    }
    
    • 输出十六进制:使用 %x (小写)或 %X (大写)格式控制符。
    #include 
    
    int main() {
        int num = 10;
        printf("Decimal: %d\n", num);
        printf("Hexadecimal (lowercase): %x\n", num);
        printf("Hexadecimal (uppercase): %X\n", num);
        return 0;
    }
    

    (二) 使用 stdint.h 头文件中的类型和格式控制符

    C99 引入了 头文件,其中定义了一些整数类型,如 uint8_tuint16_t 等,并且提供了相应的格式控制符。

    #include 
    #include 
    
    int main() {
        uint8_t num = 10;
        printf("Decimal: %d\n", num);
        printf("Hexadecimal: %" PRIx8 "\n", num);
        return 0;
    }
    

    其中 PRIx8 是一个宏,用于指定输出 8 位无符号整数的十六进制形式。

    七、不同进制在位操作中的应用

    位操作在 C 语言中是一种非常强大的工具,而不同进制的表示在位操作中经常会用到。

    (一) 按位与(&

    按位与操作将两个操作数对应的位进行与运算。

    例如:

    int a = 0b1010;  // 10
    int b = 0b1100;  // 12
    
    int result = a & b;  // 0b1000  即 8
    

    (二) 按位或(|

    按位或操作将两个操作数对应的位进行或运算。

    例如:

    int a = 0b1010;  // 10
    int b = 0b1100;  // 12
    
    int result = a | b;  // 0b1110  即 14
    

    (三) 按位异或(^

    按位异或操作将两个操作数对应的位进行异或运算。

    例如:

    int a = 0b1010;  // 10
    int b = 0b1100;  // 12
    
    int result = a ^ b;  // 0b0110  即 6
    

    (四) 左移(<<

    左移操作将操作数的所有位向左移动指定的位数,右边用 0 填充。

    例如:

    int a = 0b1010;  // 10
    
    int result = a << 2;  // 0b101000  即 40
    

    (五) 右移(>>

    右移操作将操作数的所有位向右移动指定的位数。对于无符号数,左边用 0 填充;对于有符号数,左边用符号位填充。

    例如:

    int a = 0b1010;  // 10
    
    int result = a >> 2;  // 0b0010  即 2
    

    八、实际应用场景

    (一) 权限控制

    在许多系统中,权限通常使用位来表示。例如,一个文件可能具有读、写和执行权限,可以使用不同的位来表示这些权限。

    #define READ_PERMISSION 0b001
    #define WRITE_PERMISSION 0b010
    #define EXECUTE_PERMISSION 0b100
    
    int permissions = READ_PERMISSION | WRITE_PERMISSION;  // 具有读和写权限
    

    (二) 数据压缩

    通过将数据以特定的二进制格式表示,可以实现数据压缩,减少存储空间。

    (三) 硬件通信

    在与硬件设备进行通信时,经常需要处理二进制数据。

    (四) 加密算法

    许多加密算法涉及到对数据的位操作和不同进制的转换。

    了解和掌握 C 语言中不同进制的数字表示以及它们的处理方法对于编写高效、灵活和功能强大的程序是非常重要的。通过合理地运用不同进制和位操作,可以解决许多复杂的问题,并提高程序的性能和效率。


    分割线

    🎉相关推荐

    分割线



  • 相关阅读:
    【剑指Offer | C++ 】面试题6:替换空格
    【Unity3D】UGUI物体世界坐标转屏幕坐标问题
    记一次线程堵塞(挂起)导致消息队列积压
    数据结构初阶——排序
    技术应用:C# System.Data.DataTable().Compute 基本用法
    TS编译选项——TS文件编译后消除注释
    记一次详细的实战渗透
    IDEA PermGen space内存溢出
    MySQL性能优化 一、系统配置优化
    【剑指Offer】58-Ⅱ.左旋转字符串
  • 原文地址:https://blog.csdn.net/zenson_g/article/details/140344768