#include #include #include #include #define VALID_HEX_VALUES "0123456789abcdefABCDEF" #define BLOCK_SIZE 5 #define BLOCK_COUNT 5 #define BIT_COUNT BLOCK_SIZE * BLOCK_COUNT #define MAX_DEC_VALUE pow(2, BIT_COUNT) - 1 int is_valid_hex_value(char str[]); void dec_to_bin_arr(long dec, int* bin_arr_buf, int bin_arr_len); void print_bin_arr(int* bin_arr, int bin_arr_len, int block_size); int main(int argc, char* argv[]) { printf("\n"); if ( argc !=3 || !is_valid_hex_value(argv[1]) || !is_valid_hex_value(argv[2])) { printf("This application will return the sum of two hex values.\n" "It requires exactly two valid hex arguments.\n\n"); exit(EXIT_FAILURE); } unsigned long long first_number = strtol(argv[1], NULL, 16); unsigned long long second_number = strtol(argv[2], NULL, 16); unsigned long long sum_number = first_number + second_number; if (sum_number > MAX_DEC_VALUE) { printf("The sum is larger than %g, the max value that can be\n" "represented with four blocks of 4 bits.\n\n", MAX_DEC_VALUE); exit(EXIT_FAILURE); } printf(" * First Input Number: %ld\n" " * Second Input Number: %ld\n" " * Result: %ld\n", first_number, second_number, sum_number); int bin_arr[BIT_COUNT] = {0}; dec_to_bin_arr(sum_number, bin_arr, BIT_COUNT); printf("\n"); print_bin_arr(bin_arr, BIT_COUNT, BLOCK_SIZE); printf("\n\n"); exit(EXIT_SUCCESS); } int is_valid_hex_value(char str[]) { for (int ci = 0; ci < strlen(str); ci++) { int char_is_valid = 0; for (int vci = 0; vci < strlen(VALID_HEX_VALUES); vci++) if (str[ci] == VALID_HEX_VALUES[vci]) char_is_valid = 1; if (!char_is_valid) return 0; } return 1; } void dec_to_bin_arr(long dec, int* bin_arr_buf, int bin_arr_len) { memset(bin_arr_buf, 0, sizeof bin_arr_buf); for (int i = 0; dec > 0; i++) { bin_arr_buf[i] = dec % 2; dec = dec / 2; } } void print_bin_arr(int* bin_arr, int bin_arr_len, int block_size) { for (int i = bin_arr_len - 1; i >= 0; i--) { printf("%d", bin_arr[i]); if (i % block_size == 0) printf(" "); } }