我想将十进制转换为二进制,但输出应该没有前导零,那么如何删除零? (代码有效,用C语言编写)
BarProtocol
答案 0 :(得分:1)
// Skip leading zeros
int d = 0 ;
for( d = 0; n[d] == 0 && d < 15; d++ )
{
// nothing
}
// Print significant digits
for( ; d < 16; d++ )
{
printf( "%d ", n[d] ) ;
}
请注意,dec2bin
会在int
中生成一个二进制数字数组。这显然不是从十进制转换为二进制,因为int
已经是二进制 - scanf()
调用已经转换为二进制(int
) %d
说明符。鉴于它已经是二进制的,该函数过于复杂。你实际在做的只是将单个位扩展为整数值0和1的数组。
考虑:
int* int2bin( int N, int n[] )
{
for( int d = 15; d >= 0; d-- )
{
n[d] = (N & (0x0001 << d)) == 0 ? 0 : 1 ;
}
return n ;
}
然而,将字符串生成为ASCII数字而不是整数数组可能更有意义。
char* int2bin( int val, char* str )
{
// Skip leading zeros
int d = 0 ;
for( d = 0; (val & (1<<d)) == 0 && d < 15; d++ )
{
// nothing
}
// Significant digits
for( int s = 0 ; d < 16; s++; d++ )
{
str[s] = (val & (1<<d)) == 0 ? '0' : '1' ;
}
str[s] = 0 ;
return str ;
}
然后输出就是:
char n[17] ;
printf("%s", int2bin(var, n) ) ;
答案 1 :(得分:0)
这里有一些问题。
warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
C89
中,默认的返回类型被假定为int。main()
更改为int main()
,那么如果您添加EXIT_SUCCESS
,则应返回整数值或stdlib.h
。return 0;
表示程序已成功执行。你可以做的是循环你的阵列,寻找第一个&#34; 1&#34;然后开始打印。你可以使用一个标志。
注意:如果用户输入&#34; 0&#34;,只需打印&#34; 0&#34;,无需调用您的功能。
以下是一个例子:
#include <stdio.h>
typedef enum { false, true } bool;
void dec2bin(int, int[]);
int main()
{
int var=0;
const int size = 16;
int n[size];
bool startPrinting = false;
printf("Number(>=0, <65535): ");
scanf("%d", &var);
if (var == 0)
{
printf("0\n");
}
else
{
dec2bin(var, n);
for (int cnt = 0; cnt < size; cnt++)
{
if (n[cnt] == 1) // Check for the first "1" in n
{
startPrinting = true;
}
if (startPrinting)
{
printf("%d", n[cnt]);
}
}
printf("\n");
}
return 0;
}
void dec2bin(int N, int n[]){
int count = 15;
for(count=15; count >=0; count--){
n[count] = N%2;
N=N/2;
}
}
以下是一些示例输出:
> ./out
Number(>=0, <65535): 32
100000
> ./out
Number(>=0, <65535): 16
10000
> ./out
Number(>=0, <65535): 15
1111
> ./out
Number(>=0, <65535): 1
1
> ./out
Number(>=0, <65535): 0
0