Двоичный к unsigned int, используя побитовые операции и арифметику указателя в C

Я могу использовать только побитовые операции и арифметику указателей для решения этой проблемы. Я преобразовываю из двоичного в unsigned int.

Функция, которую я пишу:

unsigned int atob(const char* nptr); 

atob («101») должен возвращать 5, atob («11000») должен возвращать 24, atob («11 $») должен вернуть 3, а atop («») должен вернуть 0.

Я довольно новичок в побитовых операциях, поэтому мне действительно нужна помощь в этой области.

редактировать:

nptr может быть увеличен, а не разрешены другие inc / dec.

 unsigned bits2val(char *bits) { unsigned val; for (val = 0; *bits; bits++) { if (*bits == '1') val = (val << 1) | 1; else if (*bits == '0' ) val <<= 1; else break; } return val; } 

Вот мой пример реализации, используя только сдвиги и ors (предполагая, что вы можете использовать ++ для манипуляции с строкой):

 unsigned atob(const char *input) { unsigned result = 0; unsigned currentBit = 0; // we need to go right to left; const char *end = input; // make sure we only read '0's and '1's while ((*end == '0') || (*end == '1')) { end++; } while (--end >= input) { // check for overflow if ((currentBit >> 3) > sizeof(result)) break; char isCurrentBitSet = *end == '1'; unsigned setValue = (isCurrentBitSet << currentBit); result |= setValue; currentBit++; } return result; }