Как я преобразовываю двоичную строку как "010011101" к интервалу, и как я преобразовываю интервал, как 5, к строке "101" в C?
Если это домашнее задание, то они, вероятно, хотят, чтобы вы реализовали strtol
, у вас будет цикл примерно такой:
char* start = &binaryCharArray[0];
int total = 0;
while (*start)
{
total *= 2;
if (*start++ == '1') total += 1;
}
Если вы хотите пофантазировать, то можете использовать в цикле вот это:
total <<= 1;
if (*start++ == '1') total^=1;
Функция strtol
в стандартной библиотеке принимает параметр "base", который в данном случае будет равен 2.
int fromBinary(const char *s) {
return (int) strtol(s, NULL, 2);
}
(первый код на C, который я написал примерно за 8 лет :-)
Я думаю, что это действительно зависит от некоторых вопросов о ваших строках/программе. Если, например, вы знаете, что ваше число не будет больше 255 (IE вы используете только 8 бит или 8 0s/1s), вы могли бы создать функцию, где вы передаете ей 8 бит из вашей строки, проходите ее и добавляете к сумме, которую вы возвращаете каждый раз, когда вы попадаете в 1. IE если вы попали в бит для 2^7 добавьте 128 и следующий бит, который вы попали был 2^4 добавьте 16.
Это моя быстрая и грязная идея. Я думаю больше и гуглю для вас пока в школе :D
.Для второй части вопроса, т.е. «как мне преобразовать int, например 5, в строку «101» в C? », Попробуйте что-нибудь вроде:
void
ltostr( unsigned long x, char * s, size_t n )
{
assert( s );
assert( n > 0 );
memset( s, 0, n );
int pos = n - 2;
while( x && (pos >= 0) )
{
s[ pos-- ] = (x & 0x1) ? '1' : '0'; // Check LSb of x
x >>= 1;
}
}
Вы можете использовать следующую кодировку
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
int nRC = 0;
int nCurVal = 1;
int sum = 0;
char inputArray[9];
memset(inputArray,0,9);
scanf("%s", inputArray);
// now walk the array:
int nPos = strlen(inputArray)-1;
while(nPos >= 0)
{
if( inputArray[nPos] == '1')
{
sum += nCurVal;
}
--nPos;
nCurVal *= 2;
}
printf( "%s converted to decimal is %d\n", inputArray, sum);
return nRC;
}