右移算符>>是将二进制数的每一位右移。如: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。

版权声明:本文为abc36725612原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/abc36725612/p/5945543.html