C Program for Number System Conversion

C




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
  
void strrev(char*);
  
// Function to convert decimal to binary and return as a
// string
char* decimalToBinary(int decimal)
{
    // Allocate space for a 32-bit binary string + '\0'
    char* binary = (char*)malloc(33);
  
    int i = 0;
    // converting to binary
    while (decimal) {
        binary[i++] = '0' + (decimal & 1);
        decimal >>= 1;
    }
    binary[i] = '\0';
    strrev(binary);
    return binary;
}
  
// Function to convert binary to decimal and return as an
// integer
int binaryToDecimal(char binary[])
{
    int decimal = 0;
    int length = strlen(binary);
    for (int i = 0; i < length; i++) {
        decimal = decimal * 2 + (binary[i] - '0');
    }
    return decimal;
}
  
// Function to convert decimal to octal and return as a
// string
char* decimalToOctal(int decimal)
{
    // Allocate space for an octal string
    char* octal = (char*)malloc(12);
    if (octal == NULL) {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    // Convert decimal to octal
    sprintf(octal, "%o", decimal);
    return octal;
}
// Function to convert octal to decimal and return as an
// integer
int octalToDecimal(char octal[])
{
    int decimal = 0;
    int length = strlen(octal);
    for (int i = 0; i < length; i++) {
        decimal = decimal * 8 + (octal[i] - '0');
    }
    return decimal;
}
  
// Function to convert hexadecimal to binary and return as a
// string
char* hexadecimalToBinary(char hex[])
{
    // converting hexadecimal string to integer
    unsigned int hexNum;
    sscanf(hex, "%x", &hexNum);
    // string to store binary number
    char binary[33] = "";
    // converting to hexadecimal
    int i = 0;
    while (hexNum) {
        binary[i++] = '0' + hexNum % 2;
        hexNum /= 2;
    }
    binary[i] = '\0';
    strrev(binary);
  
    return strdup(binary);
}
  
// Function to convert binary to hexadecimal and return as a
// string
char* binaryToHexadecimal(char binary[])
{
    // Pad the binary string with leading zeros to ensure
    // it's a multiple of 4
    int length = strlen(binary);
    int padding = (4 - (length % 4)) % 4;
    char paddedBinary[129];
    memset(paddedBinary, '0', padding);
    strcpy(paddedBinary + padding, binary);
    // Define a mapping of binary strings to their
    // hexadecimal representations
    char* binaryHexDigits[]
        = { "0000", "0001", "0010", "0011", "0100", "0101",
            "0110", "0111", "1000", "1001", "1010", "1011",
            "1100", "1101", "1110", "1111" };
    char hexadecimal[33] = ""; // Allocate space for an
                               // 8-digit hexadecimal string
    // Iterate through groups of 4 binary digits and convert
    // to hexadecimal
    for (int i = 0; i < length + padding; i += 4) {
        char group[5];
        strncpy(group, paddedBinary + i, 4);
        group[4] = '\0';
        // Find the corresponding hexadecimal digit
        for (int j = 0; j < 16; j++) {
            if (strcmp(group, binaryHexDigits[j]) == 0) {
                // Append the corresponding hexadecimal
                // digit
                char hexDigit[2];
                sprintf(hexDigit, "%X", j);
                strcat(hexadecimal, hexDigit);
                break;
            }
        }
    }
    return strdup(hexadecimal);
}
  
// driver code
int main()
{
    int choice;
    while (1) {
        printf("\nMenu:\n");
        printf("1. Decimal to Binary\n");
        printf("2. Binary to Decimal\n");
        printf("3. Decimal to Octal\n");
        printf("4. Octal to Decimal\n");
        printf("5. Hexadecimal to Binary\n");
        printf("6. Binary to Hexadecimal\n");
        printf("7. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);
  
        if (choice == 7) {
            printf("Goodbye!\n");
            break;
        }
  
        char input[100]; // Buffer for user input
        switch (choice) {
        case 1:
            printf("Enter a decimal number: ");
            scanf("%d", &choice);
            char* result = decimalToBinary(choice);
            printf("Decimal to Binary: %s\n", result);
            free(result);
            break;
        case 2:
            printf("Enter a binary number: ");
            scanf("%s", input);
            int binaryResult = binaryToDecimal(input);
            printf("Binary to Decimal: %d\n", binaryResult);
            break;
        case 3:
            printf("Enter a decimal number: ");
            scanf("%d", &choice);
            result = decimalToOctal(choice);
            printf("Decimal to Octal: %s\n", result);
            free(result);
            break;
        case 4:
            printf("Enter an octal number: ");
            scanf("%s", input);
            int octalResult = octalToDecimal(input);
            printf("Octal to Decimal: %d\n", octalResult);
            break;
        case 5:
            printf("Enter a hexadecimal number: ");
            scanf("%s", input);
            result = hexadecimalToBinary(input);
            printf("Hexadecimal to Binary: %s\n", result);
            free(result);
            break;
        case 6:
            printf("Enter a binary number: ");
            scanf("%s", input);
            result = binaryToHexadecimal(input);
            printf("Binary to Hexadecimal: %s\n", result);
            free(result);
            break;
        default:
            printf("Invalid choice. Please enter a valid "
                   "option.\n");
        }
    }
  
    return 0;
}
  
// reversing string
void strrev(char* str)
{
    int i = 0;
    int j = strlen(str) - 1;
    while (i < j) {
        char c = str[i];
        str[i] = str[j];
        str[j] = c;
        i++;
        j--;
    }
}


Output

1. Decimal to Binary

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 1
Enter a decimal number: 128
Decimal to Binary: 10000000

2. Binary to Decimal

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 2
Enter a binary number: 10000000
Binary to Decimal: 128

3. Decimal to Octal

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 3
Enter a decimal number: 100
Decimal to Octal: 144

4. Octal to Decimal

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 4
Enter an octal number: 144
Octal to Decimal: 100

5. Hexadecimal to Binary

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 5
Enter a hexadecimal number: a10
Hexadecimal to Binary: 101000010000

6. Binary to Hexadecimal

Menu:
1. Decimal to Binary
2. Binary to Decimal
3. Decimal to Octal
4. Octal to Decimal
5. Hexadecimal to Binary
6. Binary to Hexadecimal
7. Exit
Enter your choice: 6
Enter a binary number: 101000010000
Binary to Hexadecimal: A10

Number System Conversion in C

Number system conversion is a fundamental concept in computer science and programming. It involves changing the representation of a number from one base to another, such as converting a decimal number to binary or a hexadecimal number to binary.

In this article, we will create a console program in the C language to perform various number system conversions. Our program will be capable of conversion between the following number systems:

  • Decimal to Binary
  • Binary to Decimal
  • Decimal to Octal
  • Octal to Decimal
  • Hexadecimal to Binary
  • Binary to Hexadecimal

 

Similar Reads

Understanding Number System Conversions

Before we look into the C program, let’s discuss some of the commonly used number systems:...

How the Program Work?

We define functions for decimal-to-binary, binary-to-decimal, and other mentioned conversions. These functions implement the standard method for the respective conversions....

C Program for Number System Conversion

C #include #include #include    void strrev(char*);    // Function to convert decimal to binary and return as a // string char* decimalToBinary(int decimal) {     // Allocate space for a 32-bit binary string + '\0'     char* binary = (char*)malloc(33);        int i = 0;     // converting to binary     while (decimal) {         binary[i++] = '0' + (decimal & 1);         decimal >>= 1;     }     binary[i] = '\0';     strrev(binary);     return binary; }    // Function to convert binary to decimal and return as an // integer int binaryToDecimal(char binary[]) {     int decimal = 0;     int length = strlen(binary);     for (int i = 0; i < length; i++) {         decimal = decimal * 2 + (binary[i] - '0');     }     return decimal; }    // Function to convert decimal to octal and return as a // string char* decimalToOctal(int decimal) {     // Allocate space for an octal string     char* octal = (char*)malloc(12);     if (octal == NULL) {         printf("Memory allocation failed.\n");         exit(1);     }     // Convert decimal to octal     sprintf(octal, "%o", decimal);     return octal; } // Function to convert octal to decimal and return as an // integer int octalToDecimal(char octal[]) {     int decimal = 0;     int length = strlen(octal);     for (int i = 0; i < length; i++) {         decimal = decimal * 8 + (octal[i] - '0');     }     return decimal; }    // Function to convert hexadecimal to binary and return as a // string char* hexadecimalToBinary(char hex[]) {     // converting hexadecimal string to integer     unsigned int hexNum;     sscanf(hex, "%x", &hexNum);     // string to store binary number     char binary[33] = "";     // converting to hexadecimal     int i = 0;     while (hexNum) {         binary[i++] = '0' + hexNum % 2;         hexNum /= 2;     }     binary[i] = '\0';     strrev(binary);        return strdup(binary); }    // Function to convert binary to hexadecimal and return as a // string char* binaryToHexadecimal(char binary[]) {     // Pad the binary string with leading zeros to ensure     // it's a multiple of 4     int length = strlen(binary);     int padding = (4 - (length % 4)) % 4;     char paddedBinary[129];     memset(paddedBinary, '0', padding);     strcpy(paddedBinary + padding, binary);     // Define a mapping of binary strings to their     // hexadecimal representations     char* binaryHexDigits[]         = { "0000", "0001", "0010", "0011", "0100", "0101",             "0110", "0111", "1000", "1001", "1010", "1011",             "1100", "1101", "1110", "1111" };     char hexadecimal[33] = ""; // Allocate space for an                                // 8-digit hexadecimal string     // Iterate through groups of 4 binary digits and convert     // to hexadecimal     for (int i = 0; i < length + padding; i += 4) {         char group[5];         strncpy(group, paddedBinary + i, 4);         group[4] = '\0';         // Find the corresponding hexadecimal digit         for (int j = 0; j < 16; j++) {             if (strcmp(group, binaryHexDigits[j]) == 0) {                 // Append the corresponding hexadecimal                 // digit                 char hexDigit[2];                 sprintf(hexDigit, "%X", j);                 strcat(hexadecimal, hexDigit);                 break;             }         }     }     return strdup(hexadecimal); }    // driver code int main() {     int choice;     while (1) {         printf("\nMenu:\n");         printf("1. Decimal to Binary\n");         printf("2. Binary to Decimal\n");         printf("3. Decimal to Octal\n");         printf("4. Octal to Decimal\n");         printf("5. Hexadecimal to Binary\n");         printf("6. Binary to Hexadecimal\n");         printf("7. Exit\n");         printf("Enter your choice: ");         scanf("%d", &choice);            if (choice == 7) {             printf("Goodbye!\n");             break;         }            char input[100]; // Buffer for user input         switch (choice) {         case 1:             printf("Enter a decimal number: ");             scanf("%d", &choice);             char* result = decimalToBinary(choice);             printf("Decimal to Binary: %s\n", result);             free(result);             break;         case 2:             printf("Enter a binary number: ");             scanf("%s", input);             int binaryResult = binaryToDecimal(input);             printf("Binary to Decimal: %d\n", binaryResult);             break;         case 3:             printf("Enter a decimal number: ");             scanf("%d", &choice);             result = decimalToOctal(choice);             printf("Decimal to Octal: %s\n", result);             free(result);             break;         case 4:             printf("Enter an octal number: ");             scanf("%s", input);             int octalResult = octalToDecimal(input);             printf("Octal to Decimal: %d\n", octalResult);             break;         case 5:             printf("Enter a hexadecimal number: ");             scanf("%s", input);             result = hexadecimalToBinary(input);             printf("Hexadecimal to Binary: %s\n", result);             free(result);             break;         case 6:             printf("Enter a binary number: ");             scanf("%s", input);             result = binaryToHexadecimal(input);             printf("Binary to Hexadecimal: %s\n", result);             free(result);             break;         default:             printf("Invalid choice. Please enter a valid "                    "option.\n");         }     }        return 0; }    // reversing string void strrev(char* str) {     int i = 0;     int j = strlen(str) - 1;     while (i < j) {         char c = str[i];         str[i] = str[j];         str[j] = c;         i++;         j--;     } }...

Conclusion

...