69,371
社区成员
发帖
与我相关
我的任务
分享
s = ((s&0xAAAAAAAA)>>1) | ((s&0x55555555)<<1);
s = ((s&0xCCCCCCCC)>>2) | ((s&0x33333333)<<2);
s = ((s&0xF0F0F0F0)>>4) | ((s&0x0F0F0F0F)<<4);
s = ((s&0xFF00FF00)>>8) | ((s&0x00FF00FF)<<8);
s = ((s&0xFFFF0000)>>16)| ((s&0x0000FFFF)<<16);
测试过了,可用,不过前提是sizeof(int)为4,即32位的。
unsigned int transfer(unsigned int x)
{
//思路:取最低位,目标左移,原数右移,直至机器位数结束
unsigned int y=0;
unsigned int temp=0;
for ( unsigned int i=1;i<=128;i<<=1)//在设立设置机器的字长,128(0x80)是8个二进制位的机器
{
y=y<<1;//左移
temp=x&1;//取x的最低位
if (temp==1)//若是1,就“或”一下
{
y=y|temp;
}
x=x>>1;//原数右移
}
return y;
//注意:y先左移,然后取最低的那位;否则就娶不到最低的那位。
}
cout<<"transfer(7)="<<transfer(7)<<endl; //224
cout<<"transfer(224)="<<transfer(224)<<endl; //7