以下转自:http://www.xuebuyuan.com/1709778.html
题目:
一个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; // (onebit << left) as one bit in result
- 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 补记]
发现上面的实现可行,但是有一些无用的步骤,所以参考其他人的代码,做了如下的修改:
- // good ones
- 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