華科2012機試題

(1)輸入一個無符號長整數,將最高字節與最低字節互換,輸出。

(2)將長整數中間兩個字節左移n位,(n輸入),然後輸出。

(3)將長整數按照二進制輸出,沒8位一個空格。

#include<stdio.h>
#include<string.h>
void copy(int* bdest,int* bsrc,int len){
    int i=0;
    for(i=0;i<len;i++){
        bdest[i]=bsrc[i];
    }
}//複製函數,對複製後的數組進行操作,保留原始副本。
void l_hByte(int* a,int len){
    int i=0,t;
    for(i=0;i<8;i++){
        t=a[i];
        a[i]=a[len-(8-i)];
        a[len-(8-i)]=t;
    }
}//最高字節最低字節互換函數
void turnover(int* p,int start,int end){
    int i=start,j=end,t;
    while(i<j){
        t=p[i];
        p[i]=p[j];
        p[j]=t;
        i++;j--;
    }
}//交換函數
void left_move(int *p,int start,int end,int n){
  turnover(p,end-n+1,end);
  turnover(p,start,end-n);
  turnover(p,start,end);
}//左移函數。
int main(void){
    unsigned long int a,a2=0;
    int len=sizeof(unsigned long)*8;
    int bits[len],i=0,n;
    int bits2[len];
    scanf("%lu",&a);
    while(i<len){
        bits[i++]=a%2;//將輸入的unsigned long以低位到高位的二進制方式存儲在數組中。
        a/=2;
    }
    copy(bits2,bits,len);
    l_hByte(bits2,len);
    for(i=len-1;i>=0;i--){
            a2=a2*2+bits2[i];
    }
    printf("%lu\n",a2);
    copy(bits2,bits,len);
    scanf("%d",&n);
    left_move(bits2,(len/16-1)*8,(len/16+1)*8-1,n);//由於存儲方向是左邊低位,右邊高位,所以向高位的左移函數相當於該處的數組右移。
    for(i=len-1,a2=0;i>=0;i--){
            a2=a2*2+bits2[i];
    }
    printf("%lu\n",a2);
    for(i=len-1;i>0;i--){
        printf("%d",bits[i]);
        if((len-i)%8==0)printf(" ");
    }
    printf("%d\n",bits[i]);
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章