Это:
for (binary = 0; (1<<binary)<=c; binary++)
просто подсчитывает, сколько значащих битов содержится в целом числе "c".
Например, если «c» равно 0101100 в двоичном виде, старший бит - это 6-й справа, а «двоичное» будет установлено в 6.
Если «c» равно 01 в двоичном виде, старший бит будет первым справа, а «двоичный» будет установлен в 1.
Самая большая проблема с этим кодом - его почти бесполезные комментарии.
Если должны быть комментарии, замените это:
/* moving to the left until binary code matches c */
с этим:
/* Count number of significant bits.*/
Комментарии должны содержать почему код есть, а не описывать, как он работает.
Комментарии, подобные этому, не служат никакой цели:
/* since we know the size 1s and 0s are shift to right */
Вторая по величине проблема - это имена переменных. «двоичный» вводит в заблуждение. Назовите его «number_of_significant_bits», и код почти не нуждается в комментариях.