#define N 10
void fun(int *a,int n,int x) { int i,j,k
for ( i=0i<xi++ ) { k=a[0]for ( j=0j<n-1j++ ) a[j]=a[j+1]a[n-1]=k}
}
void main() { int a[N],i,x
printf("Enter %d integers: ",N)for ( i=0i<Ni++ ) scanf("%d",&a[i])
printf("Enter x: ")scanf("%d",&x)
fun(a,N,x)
printf("After Circle left shift %d bit: ",x)for ( i=0i<Ni++ ) printf("%d ",a[i])
printf("\n")
}
C语言中没有循环移位,只有移位。就是遇到边界时,会被截断的,例如11110000左移2位就是11000000
当然,你这里的0x38,循环左移2位,和左移2位没什么区别,因为边界值都是0,但是像刚刚的11110000的循环左移和左移2位,就相差很大了。
如果你需要循环的话,可以这样使用:
a=0x38
b=a>>6
a=a<<2
a=b|a
a这个时候就是循环左移了两位。
如果需要左移而已,就如三楼所说。
还有,就像3楼说的,左移相当于乘,数会变大,右移相当于除,变小。具体如下:
左移N位,就相当于原来的值乘以2的N次幂;
右移N位,如果非负数的话,就是原来的值除以2的N次幂。
希望对你有用。
在C中,左移是逻辑算术,右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.1、左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:inti=1i=i<<2//把i里的值左移2位也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了。2、右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:inti=0x80000000i=i>>1//i的值不会变成0x40000000,而会变成0xc0000000就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.