下面的代码写的太罗嗦了,请参考 对一个整数按位反转
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);
}
从网上发现了另外的一种方法,很是不错,先帖在这儿了。
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);
}