将int转换为特定大小的二进制字符串

时间:2016-04-25 17:34:37

标签: c binary

我在Java编程一段时间后努力适应C,我需要帮助。我正在寻找的是一种采用以下输入的方法:

  1. 整数n,即要转换为二进制字符串(字符数组)的那个。
  2. 整数length,它定义了字符串的长度(左边的位置没有填充二进制数,将被设置为默认值0)。

    //Here's some quick code in Java to get a better understanding of what I'm looking for:
    
    public static String convertToBinary(int length, int n) {
      return String.format("%1$" + bit + "s", Integer.toBinaryString(value)).replace(' ', '0');
    }
    
    System.out.println(convertToBinary(8,1));
    
    // OUTPUT:
    
    00000001 (not just 1 or 01)
    
  3. 有关C的等效内容的任何提示?另外,您能否向我提供一个如何返回结果二进制字符串的示例?

    (不重复,因为我正在寻找的是' 00000001',而不仅仅是' 1')

2 个答案:

答案 0 :(得分:0)

C标准库不包含与Integer.toBinaryString()等效的函数。好消息是,编写这样的函数不会太复杂,如果你正在学习C,那么这个问题对于学习如何使用按位运算符非常理想。 / p>

您需要查阅现有教程或手册以了解所有详细信息,但以下是一些对此类或类似任务有用的事例。在这些示例中,所有数字都是无符号整数。

n >> mn中的所有位右移m步,并在左侧填充零。因此,如果n = 13 (1101 in binary)n >> 16 (i.e. 110)n >> 23 (i.e. 11)

n << m做同样的事情,但向左移动。 3 << 2 == 12。这相当于将n乘以2的幂。 (如果不明白为什么会这样,那么在你清楚地理解二进制数之前,你会想到二进制数如何表示一段时间;如果你对该属性有直观的了解,它会让事情变得更容易。)

n & m求值为一个数字,使得当且仅当中的每个位 n和m时,结果的每个位都为1。例如12 & 5 == 4,(1100,0101和0100分别代表12,5和4)。

所以把它们放在一起,n & (1 << i)当且仅当位i被设置时才会非零1显然只有一个位设置,1 << i将它移动到适当的位置,并且n & (1 << i)检查该位置是否还有{1}的1位。 (请记住,最右边/最低有效位是位 0 ,而不是位1.)因此,使用它,这是一个简单的问题,分别检查每个位,看它是1还是0,你有你的二进制转换功能。

答案 1 :(得分:-1)

像这样:

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

char *convertToBinary(int length, int n) {
    unsigned num = (unsigned)n;
    int n_bit = CHAR_BIT * sizeof(num);
    if(length > n_bit){
        fprintf(stderr, "specified length  greater than maximum length.\n");
        length = n_bit;//or expand size?
    }

    char *bin = malloc(n_bit + 1);//static char bin[CHAR_BIT * sizeof(num)+1]; If you change, memmove(-->return p;), free is not necessary.
    memset(bin, '0', n_bit);
    bin[n_bit] = 0;

    char *p = bin + n_bit;
    do {
        *--p = "01"[num & 1];
        num >>= 1;
    }while(num);

    int bits = bin + n_bit - p;
    if(bits < length){
        p -= length - bits;
        return memmove(bin, p, length + 1);
    } else if(bits > length){
        fprintf(stderr, "Specified length is not enough.(%s but length is %d)\n", p, length);
        return memmove(bin, p, bits+1);//or cut off
/*
        free(bin);
        return ""; or return NULL;
*/
    }// else if(bits == length)
    return bin;
}

int main(void){
    char *sbin = convertToBinary(8, 1);
    puts(sbin);
    free(sbin);

    return 0;
}