(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;
}