#include <stdio.h>
#include <stdint.h>
const uint16_t digit[16]= {'0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F'};
void print_hex(uint16_t num) {
uint16_t mask= 0xF000;
uint16_t nib3, nib2, nib1, nib0;
nib3 = (mask & num) >> 12;
if (nib3 != 0) {
printf("%c", digit[nib3]);
}
mask = mask >> 4;
nib2 = (mask & num) >> 8;
if (nib2 != 0) {
printf("%c", digit[nib2]);
}
else if (nib3 != 0) {
printf("%c", digit[nib2]);
}
mask = mask >> 4;
nib1 = (mask & num) >> 4;
if (nib1 != 0) {
printf("%c", digit[nib1]);
}
else if ((nib3 != 0) || (nib2 != 0)) {
printf("%c", digit[nib1]);
}
mask = mask >> 4;
nib0 = (mask & num);
printf("%c", digit[nib0]);
// Your logic here
}
int main() {
uint16_t num;
scanf("%hu", &num);
print_hex(num);
return 0;
}
Look at each nibble by bitwise AND with a rolling mask
mask rolls 4 bits to the right after every digit
print a zero only if there was a leading number, unless the number is all zero,
Input
255
Expected Output
FF