Домашнее задание о битовой последовательности в Си - PullRequest
0 голосов
/ 23 октября 2011

У меня есть домашнее задание. Вопрос:

Напишите функцию, которая принимает в качестве параметра одно целое число, ввод int и возвращает беззнаковый символ такой что: a- если входное значение отрицательное или больше 11 111 111, или содержит цифру, которая не равна 0 или 1; тогда функция будет распечатать сообщение об ошибке (например, «неверный ввод») и вернуть 0, б- в противном случае; функция будет предполагать, что входное значение base-10 представляет битовую последовательность, и возвращает битовую модель только для величины, соответствующую этой последовательности.

Например: если входное значение равно 1011, возвращаемое значение равно 11, а если входное значение равно 1110, возвращаемое значение равно 14

Это моя работа для а, и я застрял на б. Как я могу получить битовую последовательность для данного целочисленного ввода?

int main()
{
    int input = 0;

printf("Please type an integer number less than 11,111,111.\n");
scanf("%d",&input);

if(input < 0 || input > 11111111)
{
    printf("Invalid Input\n");
    system("PAUSE");
    return 0;
}


for (int i = 0; i < 8; i++)
{
    int writtenInput = input;
    int single_digit = writtenInput%10;

    if(single_digit == 0 || single_digit == 1)
    {
        writtenInput /= 10;
    }
    else
    {
        printf("Your digit contains a number that does not 0 or 1. it is invalid input\n");
    system("PAUSE");
    return 0;
    }
}

printf("Written integer is %d\n",input);

system("PAUSE");
return 0;
}

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Бит, который вам не хватает, является базовым преобразованием.Чтобы интерпретировать число в базе B, вам нужно умножить цифру на N раз B ^ N (при условии, что вы начинаете считать цифры с наименее значимого).Например, в базе 16, A108 = (10)*16^3 + 1*16^2 + 0*16^1 + 8*16^0.Где в вашей базе 2 (двоичное).

В качестве альтернативы, вы можете избежать возведения в степень, если переписать выражение как:

hex A008 = ((((10*16) + 1)*16 +0)*16 + 8

Что было бы проще, если бы ваш ввод был выражен в терминахмассива возможно неизвестной длины, поскольку он легко конвертируется в цикл только сложений и умножений.

В частном случае двоичного кода вы можете использовать другое прямое решение для каждой ненулевой цифры,установите соответствующий бит в достаточно большом целочисленном типе (в вашем случае достаточно unsigned char), и значение переменной в конце цикла будет результатом преобразования.

0 голосов
/ 23 октября 2011

В вашем текущем коде есть проблема: он завершится, как только найдет один двоичный бит (в конце), и вызовет целое целое число правильно.

Я бы использовал другой подход к этой проблеме.То, что вы хотите сделать, это получить каждую цифру из целого числа отдельно.Вы сделали хорошее начало, используя модуль.Скажем, у вас был этот код:

for (int i = 0; i < 8; i++)
{
    char single_digit = input%10;
    input /= 10;
}

Это позволяет легко начать работу с цифрами.Вы будете проверять 8 битов, потому что это максимально допустимое значение (11 111 111).Проверьте, является ли каждая цифра 0 или 1. Затем вы можете начать вставлять ее в беззнаковый символ, используя побитовые операции.Сдвиньте каждую цифру влево на i , затем используйте побитовое ИЛИ.

0 голосов
/ 23 октября 2011

Прежде всего, существующая часть вашего кода нуждается в работе. Он не сообщает недвоичные цифры правильно. Вопрос в том, есть ли цифры, которые не являются ни 0, ни 1. Чтобы ответить на этот вопрос отрицательно, вам необходимо проверить каждую цифру. Ваш код может закончиться рано. Я также предлагаю переименовать функцию во что-то, что четко говорит вам, что она делает. Например haveNonBinaryDigit. Термин check не говорит вам, чего следует ожидать от возвращаемого значения.

Что касается второй части, прочитайте двоичное представление. Он довольно похож на десятичный, за исключением того, что вместо каждой цифры, взвешенной на 1, 10, 100, .., 10 ^ x, они взвешиваются на 1, 2, 4, ..., 2 ^ n. Также цифры могут иметь только значения 0 и 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...