我在Java编程一段时间后努力适应C,我需要帮助。我正在寻找的是一种采用以下输入的方法:
n
,即要转换为二进制字符串(字符数组)的那个。整数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')
答案 0 :(得分:0)
C标准库不包含与Integer.toBinaryString()
等效的函数。好消息是,编写这样的函数不会太复杂,如果你正在学习C,那么这个问题对于学习如何使用按位运算符非常理想。 / p>
您需要查阅现有教程或手册以了解所有详细信息,但以下是一些对此类或类似任务有用的事例。在这些示例中,所有数字都是无符号整数。
n >> m
将n
中的所有位右移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的幂。 (如果不明白为什么会这样,那么在你清楚地理解二进制数之前,你会想到二进制数如何表示一段时间;如果你对该属性有直观的了解,它会让事情变得更容易。)
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;
}