2014-02-03 3 views
0
#include <stdio.h> 
#include<string.h> 
int main(void) 
{ 
    int bit,i,n ; 
    unsigned long decimal=0; 
    char binary[33]; 
    printf("input binary number"); 
    scanf("%32s",binary); 
    n=strlen(binary); 
    for(i=0;i<n;i++) 
{ 
    bit=binary[i]-'0'; 
    decimal=(decimal<<1)+bit; 

    } 
    printf("decimal of %s is %lu",binary,decimal); 

return 0; 
} 

Программа для преобразования двоичного числа в decimal.program работает отлично, но я не понимаю логику для цикла.Какова логика для цикла в этой программе для преобразования двоичного числа в десятичное число

+4

Что вы не понимаете? [Бит-манипуляция] (http://en.wikipedia.org/wiki/Bit_manipulation)? – devnull

+1

Цикл 'for' просто выполняет итерацию по введенным двоичным цифрам. что тебя смущает? –

+0

BTW, он может работать правильно для правильного ввода. Но вы получите очень интересные результаты, если вы вводите, например, какие-либо не двоичные цифры или альфа-символы. –

ответ

0

Каждая цифра числа в определенном основании представляет количество, пропорциональное основанию, поднятому до уровня положения цифры.

Например, число 86 представляет собой сумму 6 * 10^0 (поскольку 6 находится в позициях единиц, цифра «индекс» 0) и 8 * 10^1 (поскольку 8 находится в позиции десятков) , 80 + 6 неудивительно, 86.

То же правило применяется для двоичных чисел.

Двоичное число 0011 представляет собой сумму 1 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + ... = 3 (в базе 10 десятичное)

Цикл for в функции используется для итерации по каждой цифре/бит и суммирования общего значения этой конкретной цифры на unsigned long с именем decimal.

0

Переменная binary является строка (массив символов), и когда вы получите свой вклад:

scanf("%32s",binary); 

Вы получаете символы, которые представляют числа. Смысл, если вы посмотрите на acii представлений символов, которые вы увидите, что:

'0' 48
'1' составляет 49
'2' 50
и т. д.

Таким образом, каждое число символов имеет целочисленное значение, соответствующее ему. Цикл for цикл по строке, которая была входом и получать фактическое целое число, который был введен путем вычитания характера '0':

// example to better explain the idea: 
int zero = '0' - '0'; // 48 - 48 
int one = '1' - '0'; // 49 - 48 

После фактического значения (1 или 0) известно, то значение сдвигается в место с последней строки в цикле:

decimal=(decimal<<1)+bit; 

в первый раз через вас будет 0 сдвигается влево на 1 (который по-прежнему 0), то вы добавить к этому bit, который будет равен 0 или 1.

так что у вас есть строка "101" вошел, первый проход вы будете иметь:

bit = '1' - '0'; // 1 
decimal = (0 << 1) + 1; // 1 

следующая:

bit = '0' - '0'; // 0 
decimal = (1 << 1) + 0; // 10 

наконец:

bit = '1' - '0'; // 1 
decimal = (10 << 1) + 1; // 101 
1

, например, вход "110", который равен '1' '1' '0' в массиве

первого цикла: с десятичной = 0

бит = '1' - '0' = 1

десятичное = (0 < < 1) + бит = 1

2-й цикл: с dcimal = 1

бит = '1' - '0' = 1

десятичное = (1 < < 1) + бит = б (10) + 1 = Ь (11)

третий цикл: с dcimal = B (11)

бит = '0' - '0' = 0

decimal = (b (11) < < 1) + бит = b (110) + 0 = b (110)

+0

thanku, было полезно – user3258736

Смежные вопросы