>\"">C语言移位算符\">>\"
右移算符>>是将二进制数的每一位右移。如:a=32,a>>2,就是将32的二进制数100000每一个二进制位向右移动两位。得到的是二进制数1000,也就是8。
#include <stdio.h> int main(void) { int a=32; int a_move = (a>>2); printf("a_move=%d\n",a_move); return 0; }
运行结果:
$ gcc -o aa_move aa_move.c $ ./aa_move a_move=8
如果移位之后转成二进制显示将更明白
1 #include <stdio.h> 2 #include <string.h> 3 /*转换成其他进制的函数*/ 4 char *change(int val, int base, char *retbuf ) 5 { 6 static char *str = "0123456789ABCDEF"; 7 char *p; 8 char buf[15]; 9 10 p = buf+14; 11 *p = 0; 12 13 do { *--p = str[val % base]; } while( val /= base ); 14 strcpy(retbuf,p); 15 return retbuf; 16 } 17 18 void main() 19 { 20 int a=0; 21 int j; 22 char buf[32]; 23 //显示成:十进制 二进制 八进制 十六进制 24 printf(" decimal binary octonary hexadecimal\n"); 25 for(j=0;j<8;j++) 26 { 27 a = (a<<1)+1; //移位操作 28 29 change(a,10,buf); //十进制 30 printf("a= %-8s",buf); 31 32 change(a,2,buf); //二进制 33 printf(" %-8s",buf); 34 35 change(a,8,buf); //八进制 36 printf(" %-8s",buf); 37 38 change(a,16,buf); //十六进制 39 printf(" %-8s\n",buf); 40 } 41 }
运行结果
$ gcc -o move move.c $ ./move decimal binary octonary hexadecimal a= 1 1 1 1 a= 3 11 3 3 a= 7 111 7 7 a= 15 1111 17 F a= 31 11111 37 1F a= 63 111111 77 3F a= 127 1111111 177 7F a= 255 11111111 377 FF
tips:
2的几次方就是二级制中,1向左移多少位得到。如 2^(3) = 1UL <<3。
这在单位转换中很实用,例如将兆字节转为字节。1Megabyte = 2^10 Kilobyte = 2^10 * 2^10 Byte。那么512 Megabyte = 512 UL << 20。