使用移位操作符实现无符号整数位反转

来源:互联网 发布:易语言编程教学 编辑:程序博客网 时间:2024/05/20 18:47

>>

左移

各二进位全部左移若干位,高位丢弃,低位补0

>> 

右移

各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)。

左移右移符号结合性L-R
  #include <stdio.h>  template <class T>  void PrintfBinary(T a)  {      int i;      for (i = sizeof(a) * 8 - 1; i >= 0; --i)      {          if ((a >> i) & 1)              putchar('1');          else               putchar('0');          if (i%8==0)              putchar(' ');      }      putchar('\n');  } int main()  {  int ll=0x800000ff;printf("算数右移1位:\n");PrintfBinary(ll);ll>>=1;printf("算数右移后\n");PrintfBinary(ll);}  



1与0异或得1,1与1异或得0,所以与1异或的结果与原来的位相反。
0与0异或得0,0与1异或得1,所以与0异或的结果与原来的位相同。

1与0相与得0,1与1相与的1,所以与1相与的结果与原来的位相同。
0与0相与得0,0与1相与得0,所以与0相与的结果为0。

1与0相或得0,1与1相或得1,所以与1相或的结果为1。
0与0相或得0,0与1相或得1,所以与0相或的结果与原来的位相同。
<pre name="code" class="html">#include <stdio.h>  template <class T>  void PrintfBinary(T a)  {      int i;      for (i = sizeof(a) * 8 - 1; i >= 0; --i)      {          if ((a >> i) & 1)              putchar('1');          else               putchar('0');          if (i == 8)              putchar(' ');      }      putchar('\n');  } template<typename T>T Reverse(T a){int len=sizeof(T)*8;int i,j;i=0;j=len-1;int tem1,tem2;while(i<j){tem1=(a>>(i%len))&1;tem2=(a>>(j%len))&1;if(tem1!=tem2){a^=1<<(i%len);a^=1<<(j%len);}i++;j--;}return a;}int main()  {      printf("二进制逆序\n\n");      printf("逆序前:    ");      unsigned short a = 12345;      PrintfBinary(a);      printf("逆序后:    ");    unsigned short result=Reverse(a);    PrintfBinary(result);  }  




计算整数中1的个数:
#include <stdio.h>  template <typename T>  void PrintfBinary(T a)  {      int i;      for (i = sizeof(a) * 8 - 1; i >= 0; --i)      {          if ((a >> i) & 1)              putchar('1');          else               putchar('0');          if (i % 8==0)              putchar(' ');      }      putchar('\n');  } template<typename T>int comnumof1(T a){int len=sizeof(T)*8;int count=0;for(int i=0;i<len;i++){if(( (a>>i)&1)==1)count++;}return count;}int main()  {      printf("二进制中1的个数\n\n");      unsigned short a = 34520;      printf("原数    %6d的二进制为:  ", a);      PrintfBinary(a);      printf("原数   %6d中1的个数为%d \n",a,comnumof1(a));        return 0;  }  


0 0