现在的位置: 首页 > 综合 > 正文

按位反转

2013年12月11日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭

下面的代码写的太罗嗦了,请参考 对一个整数按位反转

void Fan1()
{
 unsigned  int Number;
    unsigned int Temp1,Temp2,Temp3;
    int i = 31;

    Temp1 = 0xaaaaaaaa;
    Temp2 = 1;
 Temp3 = 0;
    Number = 0;
 printf("Number = 0x%x/n",Temp1);
 for(i=31;i > 0; i-=2)
 {
  Number = Number   |   ( (Temp1 & Temp2) << i );
  Temp2 = Temp2 <<1;
 }
 Temp2 = 0x80000000;
 for(i=31;i > 0; i-=2)
 {
  Number = Number    |   ( (Temp1 & Temp2) >> i );
  Temp2 = Temp2 >>1;
 }
 printf("Number = 0x%x/n",Number);

void Fan2()
{
     unsigned int Number;
    unsigned int Temp1,Temp2,count;
    int i;
     int m_SemiLen,m_ShiftLen;
     Number = 0xAAAAAAAA;
    Temp1 = 1;
     Temp2 = 0;
     count = 1;
     //printf("Number = 0x%x/n",Number);
     for(i = 0;i < 16; i++)
     {
         count = 1;
         //分别取高位和低位
         Temp1 = Number & (count << i);
         Temp2 = Number & (count << (31 -i));
         //把高位和低位分别置零
         Number = Number & (~(count << i));
         Number = Number & (~(count << (31-i)));
         //把取得的值移动相应的位
         Temp1 = Temp1 << (m_ShiftLen-2*i);
         Temp2 = Temp2 >> (m_ShiftLen-2*i);
         //用或操作来对高位和低位赋值交换。
         Number = Number | Temp1;
         Number = Number | Temp2;
     }
     printf("Number = 0x%x/n",Number);
}

第一种方法是采用取一位放一位,第一个循环搞定“低16位->高16位”,第二个循环搞定“高16位->低16位”。
第二种方法是采用每次取两位来进行对换,共一个循环,16次可以对完。

从网上发现了另外的一种方法,很是不错,先帖在这儿了。

void Fan3()
{
    unsigned int x = 0xAAAAAAAA;
    x = (x & 0x55555555) << 1 | (x & 0xaaaaaaaa) >> 1;
    x = (x & 0x33333333) << 2 | (x & 0xcccccccc) >> 2;
    x = (x & 0x0f0f0f0f) << 4 | (x & 0xf0f0f0f0) >> 4;
    x = (x & 0x00ff00ff) << 8 | (x & 0xff00ff00) >> 8;
    x = (x & 0x0000ffff) << 16 | (x & 0xffff0000) >> 16;
    printf("Number = 0x%x/n",x);
}

抱歉!评论已关闭.