Преобразование целого числа в двоичное в C - PullRequest
5 голосов
/ 30 марта 2011

Я пытаюсь преобразовать целое число 10 в двоичное число 1010.

Этот код пытается это сделать, но я получаю segfault на strcat ():

int int_to_bin(int k)
{
   char *bin;

   bin = (char *)malloc(sizeof(char));
   while(k>0) {
      strcat(bin, k%2);
      k = k/2;
      bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1));
   }
   bin[sizeof(bin)-1] = '\0';

   return atoi(bin);
}

Какпреобразовать целое число в двоичное в C?

Ответы [ 10 ]

13 голосов
/ 30 марта 2011

Если вы хотите преобразовать число в другое число (не число в строку символов), и вы можете сделать это с небольшим диапазоном (от 0 до 1023 для реализаций с 32-разрядными целыми числами), вам не нужно добавлять char* к решению

unsigned int_to_int(unsigned k) {
    if (k == 0) return 0;
    if (k == 1) return 1;                       /* optional */
    return (k % 2) + 10 * int_to_int(k / 2);
}

HalosGhost предложено свести код в одну строку

unsigned int int_to_int(unsigned int k) {
    return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k / 2)));
}
6 голосов
/ 30 марта 2011

Вам нужно инициализировать bin, например,

bin = malloc(1);
bin[0] = '\0';

или использовать calloc:

bin = calloc(1, 1);

У вас также есть ошибка здесь:

 bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1));

это необходимобыть:

 bin = (char *)realloc(bin, sizeof(char) * (strlen(bin)+1));

(т.е. использовать strlen, а не sizeof).

И вам следует увеличить размер до Вызов strcat.

И Вы не освобождаете бункер, поэтому у вас есть утечка памяти.

И вам нужно преобразовать 0, 1в '0', '1'.

и вы не можете поместить символ в строку.

Так что кроме этого, он близок, но кодвероятно, должно быть больше похоже на это (предупреждение, не проверено!):

int int_to_bin(int k)
{
   char *bin;
   int tmp;

   bin = calloc(1, 1);
   while (k > 0)
   {
      bin = realloc(bin, strlen(bin) + 2);
      bin[strlen(bin) - 1] = (k % 2) + '0';
      bin[strlen(bin)] = '\0';
      k = k / 2;
   }
   tmp = atoi(bin);
   free(bin);
   return tmp;
}
5 голосов
/ 30 марта 2011

Просто используйте itoa для преобразования в строку, а затем используйте atoi для преобразования обратно в десятичную.

unsigned int_to_int(unsigned int k) {
    char buffer[65]; /* any number higher than sizeof(unsigned int)*bits_per_byte(8) */
    return atoi( itoa(k, buffer, 2) );
}
3 голосов
/ 29 марта 2014

Рабочее решение для преобразования целых чисел в двоичное приведено ниже.

int main()
{
    int num=241; //Assuming 16 bit integer
    for(int i=15; i>=0; i--) cout<<((num >> i) & 1);
    cout<<endl;
    for(int i=0; i<16; i++) cout<<((num >> i) & 1);
    cout<<endl;
    return 0;
}

Вы можете захватить часть cout << на основании ваших собственных требований. </p>

2 голосов
/ 25 марта 2015

Ну, у меня была такая же проблема ... поэтому я нашел эту тему

Мне кажется, ответ от пользователя: "pmg" не всегда работает.

unsigned int int_to_int(unsigned int k) {
    return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k / 2)));
}

Причина: двоичное представление хранится в виде целого числа. Это довольно ограничено. Представьте себе преобразование десятичной дроби в двоичную:

 dec 255  -> hex 0xFF  -> bin 0b1111_1111
 dec 1023 -> hex 0x3FF -> bin 0b11_1111_1111

и вы должны хранить это двоичное представление как десятичное число.

Я думаю, решение от Энди Финкенштадта самое близкое к тому, что вам нужно

unsigned int_to_int(unsigned int k) {
    char buffer[65]; // any number higher than sizeof(unsigned int)*bits_per_byte(8)
    return itoa( atoi(k, buffer, 2) );
}

но все равно это не работает для больших чисел. Не удивительно, так как вам, вероятно, не нужно преобразовывать строку обратно в десятичную. Это имеет меньше смысла. Если вам нужно двоичное число, как правило, вам нужно где-нибудь текст , поэтому оставьте его в строковом формате .

просто используйте itoa ()

char buffer[65];
itoa(k, buffer, 2);
2 голосов
/ 17 марта 2014

Вы можете использовать функцию этой функции для возврата char* со строковым представлением целого числа:

   char* itob(int i) {
      static char bits[8] = {'0','0','0','0','0','0','0','0'};
      int bits_index = 7;
      while ( i > 0 ) {
         bits[bits_index--] = (i & 1) + '0';
         i = ( i >> 1);
      }
      return bits;
   }

Это не идеальная реализация, но если вы протестируете с помощью простого printf("%s", itob(170)), выполучить 01010101, насколько я помню, 170 было.Добавьте atoi(itob(170)), и вы получите целое число, но оно определенно не равно 170 в целочисленном значении.

0 голосов
/ 02 ноября 2018

Вы можете преобразовать десятичное число в bin, hexa в десятичное, hexa в bin, и т. Д., Следуя этому примеру. ПРЕОБРАЗОВАНИЕ ДЕСЯТИЧНОГО В БИН

int convert_to_bin(int number){
    int binary = 0, counter = 0;
    while(number > 0){
        int remainder = number % 2;
        number /= 2;
        binary += pow(10, counter) * remainder;
        counter++;
    }   
}

Затем вы можете напечатать двоичный эквивалент, например:

printf("08%d", convert_to_bin(13)); //shows leading zeros

0 голосов
/ 19 ноября 2017
void intToBin(int digit) {
    int b;
    int k = 0;
    char *bits;

    bits= (char *) malloc(sizeof(char));
    printf("intToBin\n");
    while (digit) {
        b = digit % 2;
        digit = digit / 2;
        bits[k] = b;
        k++;

        printf("%d", b);
    }
    printf("\n");
    for (int i = k - 1; i >= 0; i--) {
        printf("%d", bits[i]);

    }

}
0 голосов
/ 21 августа 2015

Вы можете использовать эту функцию, чтобы получить массив битов из целого числа.

    int* num_to_bit(int a, int *len){
        int arrayLen=0,i=1;
        while (i<a){
            arrayLen++;
            i*=2;
        }
        *len=arrayLen;
        int *bits;
        bits=(int*)malloc(arrayLen*sizeof(int));
        arrayLen--;
        while(a>0){
            bits[arrayLen--]=a&1;
            a>>=1;
        }
        return bits;
     }
0 голосов
/ 18 октября 2013
short a;
short b;
short c;
short d;
short e;
short f;
short g;
short h;
int i;
char j[256];

printf("BINARY CONVERTER\n\n\n");

//uses <stdlib.h>

while(1)
{

a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
h=0;
i=0;


gets(j);
i=atoi(j);
if(i>255){
printf("int i must not pass the value 255.\n");
i=0;
}
if(i>=128){
a=1;
i=i-128;}
if(i>=64){
b=1;
i=i-64;}
if(i>=32){
c=1;
i=i-32;}
if(i>=16){
d=1;
i=i-16;}
if(i>=8){
e=1;
i=i-8;}
if(i>=4){
f=1;
i=i-4;}
if(i>=2){
g=1;
i=i-2;}
if(i>=1){
h=1;
i=i-1;}

printf("\n%d%d%d%d%d%d%d%d\n\n",a,b,c,d,e,f,g,h);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...