二进制循环移位问题

来源:互联网 发布:unity3d 摇杆控制角色 编辑:程序博客网 时间:2024/06/05 04:00

循环移位

Time Limit: 3000ms, Memory Limit: 10000KB , Accepted:2516, Total Submissions: 3693

Description

编写函数实现value左右循环移位(即移出的位在另一端填入)。函数原型为int move(int value,int n);其中value为要循环移位的数,n为移位的位数,n的绝对值不大于16,整型为16位。如果n<0表示左移,n>0表示右移,n=0表示不移位。在主函数中输入数据并调用该函数输出结果。

Input

输入value和n,均为整型,用空格隔开

Output

 

  • Sample Input 
    134744064 -8
  • Sample Output
    134742024


#include<stdio.h>
int main()
{
long int n,a[50],b[50],c[50],i=0,sum=0,d,j,k,m;
scanf("%ld%ld",&n,&m);
    while(n)
{
d=n%2;
a[i]=d;
n=n/2;
i++;
}
if(a==0)
{
printf("%ld",n);
return 0;
    }
    for(j=0;j<i;j++)
    {
    c[j]=a[i-1-j];
    } 
    if(m>0)
    {
         for(j=0;j<i;j++)
    {
        if(j<m)b[j]=c[j+i-m];
if(j>=m)b[j]=c[j-m];
    }  
    d=1;
    for(k=0;k<i;k++)
{
  sum=sum+d*b[i-1-k];
  d=d*2;
}
printf("%ld",sum);
    return 0;
    }
    if(m<0)
    {
        m=-m;
   for(j=0;j<i;j++)
   {
   if(j<i-m)b[j]=c[j+m];
   if(j>=i-m)b[j]=c[j-i+m];
   }
   d=1;
   for(k=0;k<i;k++)
   {
   
  sum=sum+d*b[i-1-k];
  d=d*2;
   }
printf("%ld",sum);
   return 0;
    }
    
}

原创粉丝点击