【问题标题】:Convert int to binary string of certain size将 int 转换为一定大小的二进制字符串
【发布时间】:2016-08-19 05:50:16
【问题描述】:

在使用 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)
    

任何关于这在 C 中的等价物的提示?另外,您能否提供一个如何返回生成的二进制字符串的示例?

(不是重复的,因为我要查找的是“00000001”,而不仅仅是“1”)

【问题讨论】:

  • 请我引用您的“在 Java 编程一段时间后 [...] 我需要帮助”?
  • “不重复” - 可能有 2 个重复,每个问题一个。
  • 如果号码占用超过n位数怎么办?它应该截断还是增长?
  • OP 说它是 Java。
  • 你必须自己编写一个二进制格式化程序。对于十六进制,您可以使用 printf;十六进制通常一样好(每个数字四位)......要自己编写,我会使用查找表。

标签: c binary


【解决方案1】:

C 标准库不包含与Integer.toBinaryString() 等效的函数。好消息是,编写这样一个函数不会太复杂,如果你正在学习 C,这个问题非常适合学习如何使用位运算符

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

n >> mn 中的所有位向右移动m 步长,并在左侧填充零。所以如果n = 13 (1101 in binary)n >> 1 将是6 (i.e. 110)n >> 2 将是3 (i.e. 11)

n << m 做同样的事情,但向左移动。 3 << 2 == 12。这相当于将n 乘以 2 的 m 次方。 (如果不明白为什么会这样,你需要考虑一下二进制数是如何表示的,直到你清楚地理解它;如果你对这个属性有一个直观的理解,事情就会变得更容易。)

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

所以把它们放在一起,n & (1 << i) 将是非零当且仅当第 i 位被设置时:1 显然只设置了一个位,1 << i 将其移动到适当的位置,n & (1 << i) 检查是否该位置也有一个 1 位用于n。 (请记住,最右边/最低有效位是位 0,而不是位 1。)因此,使用它,只需单独检查每个位以查看它是 1 还是 0,然后您有你的二进制转换函数。

【讨论】:

    【解决方案2】:

    像这样:

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

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2014-11-28
      • 2012-02-14
      • 2016-07-13
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多