leetcode190 颠倒二进制位
题意就是将一个二进制数颠倒之后输出。思路不难,值得学习的是几个位运算符,比如&,|,n&1可用于提取n最低位的值,在n的低位为1时,n|x可用于将x赋给n的最低位。贴代码
class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t result; for(int i = 0 ; i < 32; i++) { result<<=1; result|=n&1; n>>=1; } return result; } };
还有一种分治的想法,想要完全颠倒,可以想把当前数据分为两部分,然后交换位置,在对每一个分块递归的完成这个操作。最后就能得到最后的结果。感觉思路和将某一数组向右移多少位的某一种做法是接近的。
1 class Solution { 2 public: 3 const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101 4 const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011 5 const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111 6 const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111 7 uint32_t reverseBits(uint32_t n) 8 { 9 n = (n>>1 & M1)|((n&M1) <<1); 10 n = (n>>2 & M2)|((n&M2) <<2); 11 n = (n>>4 & M4)|((n&M4) <<4); 12 n = (n>>8 & M8)|((n&M8) <<8); 13 return n>>16|n<<16; 14 } 15 };