ได้รับเลขฐานสิบหก (Hexadecimal) เป็นสตริง ภารกิจคือแปลงเป็นฐานแปด (Octal)
ขั้นตอน: 1) แปลง Hex → Binary 2) แปลง Binary → Octal
เลขฐานสิบหก (Hexadecimal)
ฐาน 16: 0-9 และ A=10, B=11, C=12, D=13, E=14, F=15
แปลงเป็น binary: แต่ละหลัก hex → binary 4 บิต แล้วรวมกัน
เลขฐานแปด (Octal)
ฐาน 8: 0-7 สร้างจากการจัดกลุ่ม binary 3 บิตต่อกลุ่ม
ตัวอย่างการแปลง 1A6
1A6 (hex) = 1, 10, 6 → binary: 0001 1010 0110
จัดกลุ่ม 3 บิต: 000 110 100 110 → octal: 0 6 4 6 = 646
ตัวอย่าง
Input: 1A6 Output: Octal Value = 646 Input: 1AA Output: 652
แนวทาง
- รับ input เป็นสตริง
- Hex → Binary: switch-case ทุกกรณี 0-F เพิ่ม binary representation (4 บิต)
- Binary → Octal: หาร binary ด้วย 1000 (3 บิต) switch-case หา digit octal สร้างเลข octal
โค้ดตัวอย่าง
#include <stdio.h>
#include <string.h>
#include <math.h>
long long int hexa_binary(char hex[]) {
long long int binary = 0, place = 1;
for (int i = 0; hex[i] != '\0'; i++) {
binary = binary * 10000; // shift 4 bits
switch (hex[i]) {
case '0': binary += 0; break;
case '1': binary += 1; break;
case '2': binary += 10; break;
case '3': binary += 11; break;
case '4': binary += 100; break;
case '5': binary += 101; break;
case '6': binary += 110; break;
case '7': binary += 111; break;
case '8': binary += 1000; break;
case '9': binary += 1001; break;
case 'a': case 'A': binary += 1010; break;
case 'b': case 'B': binary += 1011; break;
case 'c': case 'C': binary += 1100; break;
case 'd': case 'D': binary += 1101; break;
case 'e': case 'E': binary += 1110; break;
case 'f': case 'F': binary += 1111; break;
default: printf("Invalid hexadecimal input."); return -1;
}
}
return binary;
}
long long int binary_oct(long long binary) {
long long int octal = 0, place = 1;
while (binary > 0) {
int rem = binary % 1000;
int val;
switch (rem) {
case 0: val = 0; break;
case 1: val = 1; break;
case 10: val = 2; break;
case 11: val = 3; break;
case 100: val = 4; break;
case 101: val = 5; break;
case 110: val = 6; break;
case 111: val = 7; break;
default: val = 0;
}
octal = val * place + octal;
binary /= 1000;
place *= 10;
}
return octal;
}
long long int hexa_oct(char hex[]) {
long long int binary = hexa_binary(hex);
return binary_oct(binary);
}
int main() {
char hex[20] = "5CD";
printf("Octal Value = %lld", hexa_oct(hex));
return 0;
}
ผลลัพธ์
Octal Value = 2715