#include <stdio.h> #include <stdlib.h> void bit(int *n,int len)//数组的二进制表示 { int i,j; for(j=0;j<len;j++) { for(i=8*sizeof(int);i>0;i--,printf("%d",n[j]>>i&1)) if((i&7)==0) putchar(' '); putchar('/n'); } } void Lshift(void *p,int len,int w)//左移w位,前面补0 { unsigned int *n=(unsigned int*)p; int i,j=1,k=w; if(w>len<<5) w%=len<<5; else if(w>=32) { j=w/32;k=w&0x1f; for(i=len-1;i>=j;i--) n[i]=n[i-j]; for(i=0;i<j;i++) n[i]=0; } if(k>0) { for(i=len-1;i>=j;i--) n[i]=n[i]>>k|n[i-1]<<(32-k); n[i]>>=k; } } void Rshift(void *p,int len,int w)//右移w位,后面补0 { unsigned int *n=(unsigned int*)p; int i,j=1,k=w; if(w>len<<5) w%=len<<5; else if(w>=32) { j=w/32;k=w&0x1f; for(i=0;i<len-j;i++) n[i]=n[i+j]; for(;i<=len;i++) n[i]=0; } if(k>0) { for(i=0;i<len-j;i++) n[i]=n[i]<<k|n[i+1]>>(32-k); n[i]<<=k; } } int main(void) { int a[]={0xf000000f,96,95,4335,555543}; bit(a,5); puts("/n"); Lshift(a,5,15); bit(a,5); Rshift(a,5,15); puts("/n"); bit(a,5); getchar(); return 0; }