#include <stdio.h> #include <stdlib.h> int count=1; int pow1(int a,int b) { int pro=1,i; if(b==0) return 1; for(i=0;i<b;i++) { pro*=a; } return pro; } void trans(int *p1)//每次传进一个地址,调用一次这个函数,就算出这一块的10进制值,并直接输出 { int sum=0,i; p1--; for(i=0;i<8;i++)//sum=0,在第一次就已经获取了最右位的值 //注意i从0开始,不仅在次数上,与从右向左2的指数从0开始 //总结:这种8位一块的不易去判断数组的访问会不会出错,就用简单的例子去找规律 { sum += *p1 * pow1(2,i); p1--; }//当循环出去的时候,p1实际上指向了这一块的前一个元素 printf("%d",sum); //不是所有数后面都加点 if(count++ <4) printf("."); } int main() { int arr[32],n,i; char arr1[33]; scanf("%d",&n); while(n--) { count=1; scanf("%s",arr1); for(i=0;i<32;i++)//对于输入,不可能将大数直接存进一个数,即使刚好能存进,也不便访问,所以用字符串先存 { //再转换为int数组里的每一个元素 arr[i]=arr1[i]-'0'; } for(i=1;i<=4;i++) trans(arr+i*8);//arr+i*8这个是表示数组元素地址的常用形式 printf(" "); } return 0; }
题意:一个32位的串被分成4部分,每部分8位,将这8位二进制转换为十进制,就要转换4次
arr+8*1指向第二块的首元素,如果是4块,最后一次指针应该指向没有的第五块首元素地址