重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
站在用户的角度思考问题,与客户深入沟通,找到伊通网站设计与伊通网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广、申请域名、虚拟空间、企业邮箱。业务覆盖伊通地区。
#include math.h
unsigned fun(unsigned num, int n)
{
if(n 0)
{
//sizeof(unsigned)*8计算变量所占位数,如int型占32位
return (num (sizeof(unsigned)*8 - n)) | (num n); //先高位移动,再低位移动后,两者按位或,相当把低位溢出的又添加到了高位,实现了循环的效果
}
else
{
return (num (sizeof(unsigned)*8 - abs(n))) | (num abs(n));
}
}
void main(void)
{
printf("%u\n", fun(2, -34));
}
#include stdio.h
void main()
{
int i,i2,k,k2,n,m,a[20],tmp,tmp2,j=0;
scanf("%d %d",n,m);
for(i=0;in;i++)
a[i] = i+1;
for(i=0;in;i++)
printf("%d ",a[i]);
printf("\r\n");
/********转换开始*****************/
if(n%m==0)
{
i2 = n/m;
k2 = m;
}
else
{
i2 = n;
k2 = 1;
}
for(k=0;kk2;k++)
{
tmp = a[k];
j = k;
for(i=0;ii2;i++)
{
j = j+n-m;
j = j%n;
tmp2 = a[j];
a[j] = tmp;
tmp = tmp2;
}
}
/********转换结束*****************/
for(i=0;in;i++)
printf("%d ",a[i]);
printf("\r\n");
}
本来还有一个递归的方案 不过写起来太复杂 不好理解 参数太多
#include stdio.h
void fun(int value,int n,int dire)
{
if(dire==0) return;
int x=1(sizeof(int)*8-1);
int temp;
int i;
if(dire0)
{
for(i=0;in;i++)
{
temp=value1;
value=1;
if(temp) value|=x;
}
}
else
{
for(i=0;in;i++)
{
temp=value x;
value=1;
if(temp) value|=1;
}
}
}
void main()
{
int x=0x55555555;
fun(x,1,1);
printf("%x",x);
}
#includestdio.h
#define N 10
void fun(int *a,int n,int x) { int i,j,k;
for ( i=0;ix;i++ ) { k=a[0]; for ( j=0;jn-1;j++ ) a[j]=a[j+1]; a[n-1]=k; }
}
void main() { int a[N],i,x;
printf("Enter %d integers: ",N); for ( i=0;iN;i++ ) scanf("%d",a[i]);
printf("Enter x: "); scanf("%d",x);
fun(a,N,x);
printf("After Circle left shift %d bit: ",x); for ( i=0;iN;i++ ) printf("%d ",a[i]);
printf("\n");
}
C语言中没有循环移位,只有移位。
就是遇到边界时,会被截断的,例如11110000左移2位就是11000000
当然,你这里的0x38,循环左移2位,和左移2位没什么区别,因为边界值都是0,但是像刚刚的11110000的循环左移和左移2位,就相差很大了。
如果你需要循环的话,可以这样使用:
a=0x38;
b=a6;
a=a2;
a=b|a;
a这个时候就是循环左移了两位。
如果需要左移而已,就如三楼所说。
还有,就像3楼说的,左移相当于乘,数会变大,右移相当于除,变小。具体如下:
左移N位,就相当于原来的值乘以2的N次幂;
右移N位,如果非负数的话,就是原来的值除以2的N次幂。
希望对你有用。