2015-07-23 3 views
1

Я очень новичок в языке C. Мне понадобится небольшая программа для преобразования int в двоичный файл и двоичный файл, предпочтительно сохраненный в массиве, чтобы я мог дополнительно разбить их для целей декодирования. я следующее:C Программирование Преобразование целого в двоичный массив

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

int main() 
{ 
    int arr[20]; 
    int dec = 40; 
    int i=0, ArrLen; 

    if(dec>0) 
    { 
    while(dec>0) 
     { 
      arr[i]=dec%2; 
      i++; 
      dec=dec/2; 
     } 
    } 
    else 
    { 
    printf("Invalid Number"); 
    } 
} 

Из приведенного выше кода, я могу хранить двоичное значение в массиве с именем обр. Но вместо того, чтобы получать двоичный код: 101000, массив теперь подобен {"0", "0", "0", "1", "0", "1"}, что является обратным правильным ответом. Итак, вопрос, как получить массив в правильном порядке или перевернуть его, возможно? У меня 1 вещь наверняка - максимальная длина массива не будет превышать 8 элементов.

Следующий вопрос, это преобразование будет использоваться повторно. Итак, я планирую поместить его в функцию, чтобы можно было вызвать функцию, передать в целое число и получить массив в ответ. Но передать массив как возвращаемое значение, возможно ли это?

Благодарим за помощь.

+0

Начните с размышлений о том, как вы это сделаете вручную. Затем поместите это в код. Значение в int уже двоично. Существует много разных способов сделать это, особенно если вы сообщаете, что вы знаете о том, как компьютеры хранят данные. Но я предполагаю, что это назначение для класса, так как это то, что у большинства школ вы делаете раньше. – ydobonebi

+0

HI Quinn, это не задание в любом случае. Я далеко после школы. Просто я делаю больше на C#, PHP и JAVA. Не какой-либо C-язык. Печатать как BINARY легко с int, но для их хранения я пока не могу поймать мяч. –

+0

Вы не можете передать массив в C. Вы должны «malloc» в функции и вернуть указатель на адрес. –

ответ

3

Вы можете параметризовать массив с помощью указателя на int. Может быть полезно также параметризовать количество цифр.

void int_to_bin_digit(unsigned int in, int count, int* out) 
{ 
    /* assert: count <= sizeof(int)*CHAR_BIT */ 
    unsigned int mask = 1U << (count-1); 
    int i; 
    for (i = 0; i < count; i++) { 
     out[i] = (in & mask) ? 1 : 0; 
     in <<= 1; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int digit[8]; 
    int_to_bin_digit(40, 8, digit); 
    return 0; 
} 
+0

@johny, красиво сделано. Большое спасибо! –

+0

Незначительный:/* assert: count <= sizeof (unsigned) * CHAR_BIT && count> 0 */ – chux

+0

@chux Я был на заборе о 'sizeof (?)', Так как он оценивает подписанный тип и выполняет только кастинг без знака используйте логический сдвиг. «Счет» нуля не должен быть помечен как ошибка, но меньше нуля, вероятно, является ошибкой. На практике 'count' должен быть неподписанным. –

0

попробовать что-то вроде этого:

uint8_t * intToBin(int x) { 
    uint8_t *bin = (int *) malloc(8); 
    uint8_t i = 0; 
    int mask = 0x80; 
    for (i = 0; i < 8; i++) { 
     bin[i] = (x & mask) >> (7-i); 
     mask >>= 1; 
    } 
    return bin; 
} 

Включить <stdint.h> для объявления uint8_t. Помните, что freemalloc -ed память, если вы не хотите утечки памяти.

+0

Недостаточно памяти 'int * bin = (int *) malloc (8);' -> 'int * bin = malloc (8 * sizeof * bin);' – chux

+0

@chux OP требует 8 бит, хранящихся в массиве. Вероятно, я должен изменить тип 'bin' на' unsigned char' или 'uint8_t'. OP требует 8 бит, и я уже назначаю 64. Нет никакой причины, мне понадобилось бы 256 бит памяти для хранения 8 бит данных. –

+0

«OP требует 8 бит, и я уже назначаю 64» неверно. Код выделял 8 как в 'malloc (8)', что, безусловно, было недостаточным объемом памяти для 8 'int' - следовательно, комментарий. IAC, 'malloc (8)' теперь является достаточной памятью для 8 'uint8_t'. Но теперь у него есть новая проблема: возврат 'uint8_t *', который передается в' int * '. С 4-байтовым 'int' вызывающий код мог ссылаться на первые 2 массива' int * ', но, конечно, ожидал OP. 8. – chux

-1

Рекурсивная Реализация:

(Так как вы не можете иметь предварительное представление о количестве цифр (0/1) в двоичном формате заданного числа)

int arr[200]; //for storing the binary representation of num 
int i=0; // to keep the count of the no of digits in the binary representation 

void calBinary(int n) // function to recalculate 
{ 
    if(n>1) 
     calBinary(n/2); 
    arr[i++]=n%2; 
} 
+1

Ваш массив по-прежнему будет отменен. –

+0

@ M.Shaw http://ideone.com/Woyw8H –

+0

Почему downvote ?? –

0

Использование побитового логики:

for(int i = 0 ; i < 8 ; i++) 
{ 
    bytearray[i] = inputint & pow(2,7-i); 
} 
+0

Вы могли бы сделать это быстрее с использованием C-соединений и структур btw. – ydobonebi

+0

'sizeof (int)' is 4, а не 8. –

+0

И это должно быть 'pow (2, 7-i)', поэтому массив не будет отменен. –

0

Это может быть полезно:

void binary(unsigned n) 
{ 
    unsigned i; 
    for (i = 1 << 31; i > 0; i = i/2) 
     (n & i)?`/*STORE 1*/` : `/*STORE 0*/` ; 
} 
+0

Примечание: Лучше использовать '1u << 31' как' 1 << 31' - это неопределенное поведение с 32-битным 'int'. – chux

1

или рекурсивный V2.0:

#include <stdio.h> 

char *binaryToAbits(unsigned int answer, char *result) { 
    if(answer==0) return result; 
    else { 
    result=binaryToAbits(answer>>1,result); 
    *result='0'+(answer & 0x01); 
    return result+1; 
    } 
} 

int main(void) { 
    unsigned int numToConvert=0x1234ABCD; 
    char ascResult[64]; 
    *binaryToAbits(numToConvert,ascResult)='\0'; 
    printf("%s",ascResult); 
    return 0; 
} 

Обратите внимание, благодаря @chux, здесь лучше рекурсивная функция, которая обрабатывает случай преобразования 0 - это выводит "0" вместо "" :

char *binaryToAbits(unsigned int answer, char *result) { 
    if(answer>1) { 
    result=binaryToAbits(answer>>1,result); 
    } 
    *result='0'+(answer & 0x01); 
    return result+1; 
}; 
+1

1) 'numToConvert = 0' ->' "" 'а не' '0" '. 2) Конечно, достаточно 64 для '0x1234ABCD', но я ожидал бы 65 или 33. – chux

+0

@chux - конечно, но для этого потребуется еще одна функция для проверки на 0. Простой, я просто не беспокоился об этом. Размер буфера: я думал 32, потом 33 за нуль, затем округленный до 64 :) –

+1

«требуется еще одна функция для проверки на 0». Hmmm, может быть, небольшая перезапись вместо: 'if (answer> 1) {result = binaryToAbits (ответ >> 1, результат); } * result = '0' + (ответ & 1); результат возврата + 1; 'немного простой и все же обрабатывает' 0'. – chux

0

Это должно сработать.

#include <stdio.h> 

void intToBin(int dec, int bin[], int numBits){ 
    for(int i = 0; i < numBits; i++){ 
     bin[i] = 1 & (dec >> i); 
    } 
} 

void printArr(int arr[], int arrSize){ 
    for(int i = 0; i < arrSize; i++) { 
     printf("%d ", arr[i]); 
    } 
} 

int main(int argc, char* argv[]){ 
    int bin[32]; 
    intToBin(-15, bin, 32); 
    printArr(bin, 32); 
} 
Смежные вопросы