C的输出有10进制,8进制,16进制,如果有时候需要二进制的表示呢?ANSI C中没有二进制的输出形式,我们可以用自定义的函数来完成这部分的操作。<BR> |
#include "stdio.h" |
#include "limits.h" |
|
int IntegerToBinary( int , char [], int ); |
void main() |
{ |
int i; |
char c[32] = {0}; |
if (IntegerToBinary(10, c, 32)) |
{ |
for (i=0; i<32; ++i) |
{ |
putchar (c[i]); |
} |
putchar ( '/n' ); |
} |
else |
{ |
printf ( "error in the function!/n" ); |
} |
|
} |
|
int IntegerToBinary( int number, char ret[], int ret_len) |
{ |
unsigned int index; |
int i=0, N= sizeof ( int )*CHAR_BIT; //获取int类型的位数, CHAR_BIT为limit.h定义的宏,为CHAR的位数 |
if (ret_len < N) |
{ |
return 0; |
} |
index = 1<<(N-1); //将1循环左移N-1次 |
for (i=0; i<N; ++i) |
{ |
ret[i] = ((number&index)==0)? '0' : '1' ; //将需要求值的整型数与index按位相“与”,从最高位起判断是否为1 |
index >>= 1; //将index值循环右移 |
} |
return 1; |
} |
需要说明的几点是: |
1,CHAR_BIT是limit.h头文件定义的宏,表示 char 的位数。 |
2,函数内的变量index声明unsigned,因为C的左移 "<<" 会影响符号位,而右移则不影响符号位,因此,如果是 int 类型的变量index=1, |
左移31次后变为10000000000000000000000000000000,执行index >>= 1得到的结果还是10000000000000000000000000000000。 |
而如果声明为unsigned int ,左移31次后,再index >>= 1,得到的结果是01000000000000000000000000000000. |