http://blog.csdn.net/sandyzhs/article/details/3274332
题目:
一个unsigned char,记为src,把其中的字节高位和低位全部互换
分析:
想找出src中某一位的bit,肯定是要拿一个该位为1其他位为0的char,记为flag,和他进行&,取出该位的值,记为onebit。把该onbit左移(或者右移,看是否现在已经到了中间点)一定位数,就变到了他应该放到的位。
然后flag左移一位,再次&,取出下一位。这样,依次取出来然后把所有取出来的onebit进行 | 相连, 就得到了换位之后的结果。
算法代码:
-
unsigned char ReverseBits(unsigned char src)
-
{
-
-
unsigned char flags = 0x1;
-
unsigned char onebit = 0x0;
-
unsigned char result = 0x0;
-
-
int size = sizeof(unsigned char) * 8;
-
int left = size - 1;
-
for ( int i = 0; i < size; i++ )
-
{
-
onebit = src & flags;
-
if ( left > 0 )
-
onebit = onebit << left;
-
else if ( left < 0 )
-
onebit = onebit >> -left;
-
left -= 2;
-
result |= onebit;
-
flags = flags << 1;
-
}
-
-
return result;
-
}
测试代码:
-
int main(int argc, char* argv[])
-
{
-
unsigned char src = 0xaa;
-
unsigned char expected = 0x55;
-
-
unsigned char result = ReverseBits(src);
-
if ( result == expected )
-
printf("OK: %x", result);
-
else
-
printf("Error: %x", result);
-
-
getchar();
-
return 0;
-
}
[20081209 补记]
发现上面的实现可行,但是有一些无用的步骤,所以参考其他人的代码,做了如下的修改:
-
-
unsigned int Reverse( unsigned int n )
-
{
-
unsigned int result = 0;
-
int length = 32;
-
for ( int i = 0; i < length; i++ )
-
{
-
result = result << 1;
-
result = result | ( n & 0x1 );
-
n = n >> 1;
-
}
-
return result;
-
}
同样,是《编程之美》上面,有很多关于数字里面有多少位二进制1的问题。解法:
1,如上述,按位右移<<;
2,做减法,进行&&,如果>0,则计数+1.其理论基础是:最低一个1(第i位)减1之后,该位为0,该位之后所有的为1;也就是说,从第i位到第0位的所有二进制都进行的反转,所以对这部分&&必为0
阅读(752) | 评论(0) | 转发(0) |