diff --git a/conversions/binary_to_decimal.c b/conversions/binary_to_decimal.c index 352d07c16..7431995a7 100644 --- a/conversions/binary_to_decimal.c +++ b/conversions/binary_to_decimal.c @@ -1,24 +1,104 @@ +/** + * @file + * @brief Converts a [binary number to a decimal](https://byjus.com/binary-to-decimal-formula/) number. + * @details + * A binary number is an input that is checked to be binary + * then, the number is converted to a decimal number. + * @author [Kyler Smith](https://github.com/KylerSmith) + * @author [lazy-dude](https://github.com/lazy-dude) + */ + +#include /// for assert +#include /// for bool +#include /// for uintmax_t +#include /// for IO operations + /** - * Modified 07/12/2017, Kyler Smith - * + * @brief checks whether the number is binary + * @param num the number to be checked if it has binary representation + * @returns `true` if the number IS binary + * @returns `false` if the number is NOT binary */ +bool is_binary(uintmax_t num) +{ + unsigned remainder = 0; -#include + while (num > 0) { + remainder = num % 10; + // make sure each digit is 0 or 1 + if (remainder == 0 || remainder == 1) { + num /= 10; + continue; + } else + return false; + } + return true; +} -int main() +/** + * @brief finds the length of an `uintmax_t` number + * @param num whose length to be computed + * @returns the length of the number + */ +uint16_t num_len(uintmax_t num) { - int remainder, number = 0, decimal_number = 0, temp = 1; - printf("\n Enter any binary number= "); - scanf("%d", &number); - - // Iterate over the number until the end. - while (number > 0) - { - remainder = number % 10; - number = number / 10; - decimal_number += remainder * temp; - temp = temp * 2; // used as power of 2 + uint16_t len = 0; + for (len = 0; num > 0; len++) { + num /= 10; } + return len; +} + +/** + * @brief The `binary_decimal` function does the actual job of conversion + * @param number the number binary to be converted + * @returns decimal_number decimal representation of a binary number + */ +uintmax_t binary_decimal(uintmax_t number) +{ + uint8_t remainder; + uintmax_t decimal_number = 0; + uint32_t temp = 1; - printf("%d\n", decimal_number); + uint16_t length = num_len(UINTMAX_MAX) - 1; + + assert(num_len(number) <= length); + assert(is_binary(number)); + + // Iterate over the number until the end. + while (number > 0) { + remainder = number % 10; + number = number / 10; + decimal_number += remainder * temp; + temp = temp * 2; // used as power of 2 + } + + return decimal_number; +} + +/** + * @brief Self-test implementations + * @returns void + */ +static void test() +{ + assert(binary_decimal(0)==0); + assert(binary_decimal(1)==1); + assert(binary_decimal(1110001)==113); + assert(binary_decimal(11111111)==255); + assert(binary_decimal(10000000000)==1024); + assert(binary_decimal(1001110100000100)==40196); + + printf("All tests have passed!\n"); +} + +/** + * @brief main function + * @param void + * @returns 0 on exit + */ +int main() +{ + test(); // run self-test implementations + return 0; } diff --git a/conversions/decimal_to_hexa.c b/conversions/decimal_to_hexa.c index 89de59623..dbf5184c5 100644 --- a/conversions/decimal_to_hexa.c +++ b/conversions/decimal_to_hexa.c @@ -18,6 +18,7 @@ int main() * number****************/ void decimal2Hexadecimal(long num) { + char hex_letters[]="abcdef"; long decimalnum = num; long quotient, remainder; int i, j = 0; @@ -29,17 +30,17 @@ void decimal2Hexadecimal(long num) { remainder = quotient % 16; if (remainder < 10) - hexadecimalnum[j++] = 48 + remainder; + hexadecimalnum[j++] = '0' + remainder; else - hexadecimalnum[j++] = 55 + remainder; + hexadecimalnum[j++] = hex_letters[remainder-10];// 'A' quotient = quotient / 16; } // print the hexadecimal number - - for (i = j; i >= 0; i--) + printf("0x"); + for (i = j-1; i >= 0; i--) { printf("%c", hexadecimalnum[i]); }