C - 将整数转换为二进制数组

时间:2015-07-23 03:52:47

标签: c arrays dynamic-c

我是C语言的新手。 我需要一个小程序将int转换为二进制文件,二进制文件最好存储在一个数组中,这样我就可以进一步将它们分开以便进行解码。 我有以下内容:

#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");
    }
}

从上面的代码中,我可以在arr中存储二进制值。 但是,不是获得等效的二进制文件:101000,现在数组就像{0, 0, 0, 1, 0, 1},这是正确答案的颠倒。 所以问题是,如何以正确的顺序获取数组或者可能将其翻转? 我有一件事是肯定的,那就是最大数组长度不会超过8元素。

此转换将重复使用。 所以我打算把它放在一个函数中,这样我就可以调用函数,传入一个整数,然后将数组作为返回值。所以另一个问题是,将数组作为返回值是否可行?

8 个答案:

答案 0 :(得分:4)

您可以使用指向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;
}

答案 1 :(得分:1)

或递归V2.0:

'/etc/etc'

注意,感谢@chux,这里有一个更好的递归函数来处理转换0的情况 - 它输出“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;
}

答案 2 :(得分:1)

与约翰尼·凯奇(Johnny Cage)相同,只是增加了一个获得数字长度的函数

#include <math.h>

int bit_len(unsigned int n){
   return floor(log(n)/log(2))+1;
}
void int_to_bin_digit(unsigned int in, int len_digitis,int* out_digit){

  unsigned int mask = 1U << (len_digitis-1);
  int i;
  for (i = 0; i < len_digitis; i++) {
    out_digit[i] = (in & mask) ? 1 : 0;
    in <<= 1;
  }
}

int main(int argc, char* argv[]){
   int number = 30;
   int len = bit_len(number);
   int digits[len];
   int_to_bin_digit(number,len, digits);
   for( int i =0;i<len;i++){
       printf("%d",digits[i]);
   }
  return 0;
 }

答案 3 :(得分: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。 如果您不想要内存泄漏,请记住free malloc - 内存。

答案 4 :(得分:0)

使用按位逻辑:

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

答案 5 :(得分:0)

这可能会有所帮助:

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

答案 6 :(得分: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);
}

答案 7 :(得分:-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;
}