10:1010
5:101
2:10
1:1
算法描述:首先用1去与一个数进行与运算,如果返回真说明这个数对应的二进制数的末尾为1,否则为0
把得到结果存储到一个字符数组中,然后让这个数除以2,此时,尾数就是上次的倒数第二个数,
重复这个算法,直到这个数为0,退出循环。
得到的结果一定的这个数二进制的反序,此时只要写一个反序算法即可。
关于位与运算:首先把两个操作数转换为二进制,而数在内存中就是以二进制存放(因此本算法效率极高),按对应的位进行比较
当且仅当两个操作数相同的位上的数都为1结果为1
比如
10:1010
&
7:0111
2:0010
10&7==2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int toBinary(int n, char *binary);
void reverse(char *str, int length);
void main()
{
/*由于计算机和internet都没有将一个负转换为二进制数,将本算法稍经修改即可*/
int number=0;
char binary[20] = { 0 };
int length = 0;
scanf("%d",&number);
length = toBinary(number, binary);
reverse(binary, length);
printf("%d对应的二进制数:",number);
puts(binary);
system("pause");
}
//倒叙用位与运算取每一个二进制位
int toBinary(int n, char *binary)
{
int temp = 1;
int i = 0;
while (n != 0)
{
//核心算法
binary[i++] = (n & temp == 1) ? '1' : '0';
n /= 2;
}
binary[i] = 0;
return i;
}
//数组反转算法
void reverse(char *str, int length)
{
int i = 0;
char temp;
for (i = 0; i < length / 2; i++)
{
temp = str[i];
str[i] = str[length - i - 1];
str[length - i - 1] = temp;
}
str[length] = 0;
}