diff --git a/algorithms/bit-manipulation/rotate_unsigned_number.c b/algorithms/bit-manipulation/rotate_unsigned_number.c new file mode 100644 index 00000000..866492f6 --- /dev/null +++ b/algorithms/bit-manipulation/rotate_unsigned_number.c @@ -0,0 +1,169 @@ +/* +Bit-Manipulation: Rotate right and rotate left. + +For: +The All â–²lgorithms Project +Note: Only applicable for positive integers +1. rotate_right(num, times): rotate num(passed as decimal) "times" times towards right and return +eg.: rotate_right(12, 1) --> 6 +2. rotate_left(num, times): rotate num(passed as decimal) "times" times towards left and return +eg.: rotate_left(12, 2) --> 3 +Additional functions: +3. unsigned dec_to_bin(num): return decimal form of binary format number +eg.: dec_to_bin(12) --> 1100 +4. unsigned bin_to_dec(bin): return binary form of decimal format number +eg.: bin_to_dec(1100) --> 12 + +By AnshumanAryan24 https://github.com/AnshumanAryan24 +*/ + +#include +#include + +int length_of_num(unsigned); +int bin_length_of_num(unsigned); +int power(unsigned, unsigned); +unsigned* num_as_bin_array(unsigned); +unsigned array_as_bin(unsigned[], int); +unsigned dec_to_bin(unsigned); +unsigned bin_to_dec(unsigned); +unsigned rotate_right(unsigned, unsigned); +unsigned rotate_left(unsigned, unsigned); + +int length_of_num(unsigned num) +{ + /* + Returns minimum number of digits in decimal representation of number (passed in decimal format). + Returns 0 for 0. + */ + unsigned temp; + int len = 0; + // Determining length of binary number + // for (temp = num; temp != 0;temp = temp>>1) + // { + // len++; + // } + for (temp = num; temp != 0; len++, temp /= 10) + ; + return len; +} +int bin_length_of_num(unsigned num) +{ + /* + Returns minimum number of digits in binary representation of number (passed in decimal format). + Returns 0 for 0. + */ + unsigned temp; + int len = 0; + // Determining length of binary number + // for (temp = num; temp != 0;temp = temp>>1) + // { + // len++; + // } + for (temp = num; temp != 0; len++, temp >>= 1) + ; + return len; +} +int power(unsigned num, unsigned exponent) +{ + int res = 1; + if (exponent == 0) + return 1; + // while (exponent--) + // res *= num; + for ( ; exponent--; ) + res *= num; + return res; +} +unsigned* num_as_bin_array(unsigned num) +{ + int len = bin_length_of_num(num); + unsigned* arr = (unsigned*)malloc(sizeof(unsigned)*len); + for (int i=0; i>(len-i-1))&1; + return arr; +} +unsigned array_as_bin(unsigned arr[], int len) +{ + unsigned bin = 0; + if (len == 1) + return arr[0]; + else if (len < 1) + return 0; + // else + for (int i=0; i