Вывести int в двоичном представлении, используя C - PullRequest
23 голосов
/ 21 июня 2009

Я ищу функцию, позволяющую мне напечатать двоичное представление типа int. То, что я имею до сих пор, это;

char *int2bin(int a)
{
 char *str,*tmp;
 int cnt = 31;
 str = (char *) malloc(33); /*32 + 1 , because its a 32 bit bin number*/
 tmp = str;
 while ( cnt > -1 ){
      str[cnt]= '0';
      cnt --;
 }
 cnt = 31;
 while (a > 0){
       if (a%2==1){
           str[cnt] = '1';
        }
      cnt--;
        a = a/2 ;
 }
 return tmp;

}

Но когда я звоню

printf("a %s",int2bin(aMask)) // aMask = 0xFF000000

Я получаю вывод как;

0000000000000000000000000000000000xtpYy (и несколько неизвестных символов.

Это недостаток функции или я печатаю адрес массива символов или что-то в этом роде? Извините, я просто не вижу, куда иду не так.

NB Код от здесь

РЕДАКТИРОВАТЬ: Это не домашнее задание К вашему сведению, я пытаюсь отладить чужие процедуры манипулирования изображениями на незнакомом языке. Однако, если это было помечено как домашнее задание, потому что это элементарная концепция, то честная игра.

Ответы [ 17 ]

0 голосов
/ 21 июня 2009

Пара вещей:

int f = 32;
int i = 1;
do{
  str[--f] = i^a?'1':'0';
}while(i<<1);
  • Это сильно зависит от платформы, но может быть, эта идея поможет вам начать.
  • Почему бы не использовать memset (str, 0, 33) для установки весь массив символов в 0?
  • Не забудьте освободить () !!! символ * массив после вызова вашей функции!
0 голосов
/ 29 декабря 2011
void print_binary(int n) {
    if (n == 0 || n ==1) 
        cout << n;
    else {
        print_binary(n >> 1);
        cout << (n & 0x1);
    }
}
0 голосов
/ 21 июня 2009

Две простые версии с кодировкой здесь (воспроизведены с легким переформатированием).

#include <stdio.h>

/* Print n as a binary number */
void printbitssimple(int n) 
{
    unsigned int i;
    i = 1<<(sizeof(n) * 8 - 1);

    while (i > 0) 
    {
        if (n & i)
            printf("1");
        else
            printf("0");
        i >>= 1;
    }
}

/* Print n as a binary number */
void printbits(int n) 
{
    unsigned int i, step;

    if (0 == n)  /* For simplicity's sake, I treat 0 as a special case*/
    {
        printf("0000");
        return;
    }

    i = 1<<(sizeof(n) * 8 - 1);

    step = -1; /* Only print the relevant digits */
    step >>= 4; /* In groups of 4 */
    while (step >= n) 
    {
        i >>= 4;
        step >>= 4;
    }

    /* At this point, i is the smallest power of two larger or equal to n */
    while (i > 0) 
    {
        if (n & i)
            printf("1");
        else
            printf("0");
        i >>= 1;
    }
}

int main(int argc, char *argv[]) 
{
    int i;
    for (i = 0; i < 32; ++i) 
    {
        printf("%d = ", i);
        //printbitssimple(i);
        printbits(i);
        printf("\n");
    }

    return 0;
}
0 голосов
/ 21 июня 2009

Две вещи:

  1. Куда вы положили символ NUL? Я не вижу места, где установлен '\0'.
  2. Int подписано, и 0xFF000000 будет интерпретироваться как отрицательное значение. Так что while (a > 0) будет немедленно ложным.

В сторону: функция malloc внутри ужасна. Как насчет предоставления буфера для int2bin?

0 голосов
/ 03 июля 2017

Не так элегантно, но достигает своей цели, и это очень легко понять:

#include<stdio.h>

int binario(int x, int bits)
{
    int matriz[bits];
    int resto=0,i=0;
    float rest =0.0 ;
    for(int i=0;i<8;i++)
    {
        resto = x/2;
        rest = x%2;
        x = resto;
        if (rest>0)
        {
            matriz[i]=1;
        }
        else matriz[i]=0;
    }
    for(int j=bits-1;j>=0;j--)
    {
        printf("%d",matriz[j]);
    }
    printf("\n");
}
int main()
{
    int num,bits;
    bits = 8;
    for (int i = 0; i < 256; i++)
    {
        num = binario(i,bits);
    }
    return 0;
}
0 голосов
/ 09 марта 2018

Вот мое решение. Он создает маску, начиная со всех 0 и 1 в крайнем левом бите, и логически сдвигает ее вправо для каждого бита в предполагаемом 32-разрядном целом числе. Биты последовательно печатаются путем преобразования значения текущего замаскированного целого числа в логическое значение.

void printBits(int val){
    for(unsigned int mask = 0x80000000; mask; mask >>= 1){
         printf("%d", !!(mask & val));
    }
}
0 голосов
/ 04 декабря 2014
#include <stdio.h>
int main(void) {

    int a,i,k=1;
    int arr[32]; \\ taken an array of size 32

    for(i=0;i <32;i++) 
    {
        arr[i] = 0;   \\initialised array elements to zero
    }

    printf("enter a number\n");
    scanf("%d",&a);  \\get input from the user

    for(i = 0;i < 32 ;i++)
    {
        if(a&k)    \\bit wise and operation
        {
            arr[i]=1;
        }
        else
        {
            arr[i]=0;
        }
        k = k<<1; \\left shift by one place evry time
    }
    for(i = 31 ;i >= 0;i--)
    {
        printf("%d",arr[i]);   \\print the array in reverse
    }

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