题目描述
查看原题
思路
- 将每一个输入的数字转换为8位二进制数输出即可,注意十六位二进制数为一组(因为是16*16点阵!!注意读题,题目还举例说明了),所以输出两组再换行
- 注意负数转换为二进制数时的规则,先求出其相反数的八位二进制数,然后按位取反(不是取相反数,是0变1,1变0 哇),然后加1,注意在二进制数组中,是第七位加1,如果大于等于二,前一位也要加1,本位要模2
- 由2知,在遍历负数的相反数的二进制数组时,可以从后(数组下标为7处)遍历
- 注意存储二进制数组每次都要初始化为0,用memset()函数,加头文件!!#include<string.h>
代码
#include<stdio.h>
#include<string.h>
int n[35];
int er[8];
void b2(int a){
memset(er,0,sizeof(er));
int res=7;//反着存
int flag=0;
if(a==0){
return;
}
if(a<0){flag=1;a=-a;}
while(a!=1){
er[res--]=a%2;
a/=2;
}
er[res--]=1;//在等于1的时候退出了循环,要把1存进数组
if(flag){//负数处理
for(int i=0;i<=7;i++){//按位取反
if(er[i]==0) er[i]=1;
else er[i]=0;
}
for(int i=7;i>=0;i--){
if(i==7) er[i]+=1;
if(er[i]>=2){
er[i-1]+=1;
er[i]%=2;
}
}
}
}
int main(){
int i;
for(i=1;i<=32;i++){
scanf("%d",&n[i]);
}
for(i=1;i<=32;i++){
b2(n[i]);
for(int i=0;i<=7;i++){if(er[i])printf("%d",1);
else printf(" ");}
if(i%2==0)printf("\n");//2组换行
}
return 0;
}