Member 13188016 Ответов: 2

Программа на языке Си для преобразования десятичной дроби в двоичную с помощью побитового оператора and, shift


this code is an example from a book that the problem require to change decimal to binary number using bitwise AND oeprator and shift operator. i cannot understand the code although had tried to understand this code using debug compiler. suppose for a and b, user input is 10 and 8


#include <stdio.h>
#include <stdlib.h>


int count_bits (unsigned x)
{

    int bits=0;
    while(x){
        if (x&1U)bits++;
            x>>=1;


    } return bits;
}

int int_bits(void)
{
    return count_bits(~0U);
}

void print_bits(unsigned x){
    int i;
    for(i=int_bits(x)-1;i>=0;i--)
        putchar(((x>>i)&1U)?'1':'0');
}
int main(void)
{
 unsigned a,b; /*suppose user input a=10 b=8*/
 printf("enter two positive integer value=\n");
 printf("a=  "); scanf("%u",&a);
 printf("b:  "); scanf("%u",&b);

 printf("\na   =");  print_bits(a);
 printf("\na   =");  print_bits(b);
    return 0;
}


Что я уже пробовал:

in int_bits function what actually (~0U) does? <pre>
 what is the value of x in count_bits(unsigned x) function? and what is being compare in (x & 1U) and what is the relation of count_bits(~0U) and user input?
in print_bits function in putchar (((x>>i)&1u)?'1';'0'); what is the value of x and i? 
i got i=32 as bits from count_bits

что на самом деле делает эта программа для получения двоичного числа?

2 Ответов

Рейтинг:
1

Richard MacCutchan

int int_bits(unsigned x)
{
    return count_bits(~0U);
}

Это выглядит неправильно, так как он будет возвращать одно и то же значение для любого значения x Я предлагаю изменить его на:
return count_bits(x);


Member 13188016

Эх жаль правильным является int_bits (ничтожным) {
Вернуться count_bits(~0u кабелей)
}
Но до сих пор не понимаю, как он производит 1010 за 10
А с чем сравнивать, чтобы он производил 1010

Richard MacCutchan

Десятичное число 10 эквивалентно 1010 в двоичном виде. Если вы не понимаете, почему, то вам нужно прочитать о системах нумерации.

Рейтинг:
1

Patrice T

Цитата:
Программа на языке Си для преобразования десятичной дроби в двоичную с помощью побитового оператора and, shift

Программа не конвертирует, она просто отображает значение в базе 2.
Обратите внимание, что внутренне целые числа хранятся в двоичном виде в программах на языке Си.

Знать, что такое & и ~, просто прочитайте документацию о "побитовых операторах".
Знать, что такое U, прочитайте документацию о "целочисленной константе".
Цитата:
я не могу понять код, хотя и пытался понять этот код с помощью отладочного компилятора.

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


Member 13188016

Могу ли я увидеть возвращаемое значение в отладчике?
Как отлаживать на уровне машинного языка?
Потому что некоторые отладчики позволяют только наблюдать значение переменной