题目
题解
- 位运算
与运算:
(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中的指定位置数值。找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
或运算:
(1)常用来对一个数据的某些位,置1。
二进制运算里 或运算 等价于 没有进位的加法运算
- 分治
代码
// class Solution {
// public:
// uint32_t reverseBits(uint32_t n) {
// int res=0;
// for(int i=0;i<32;i++){
// res<<=1;
// res+=n&1;
// n>>=1;
// }
// return res;
// }
// };
// class Solution {
// public:
// uint32_t reverseBits(uint32_t n) {
// uint32_t res = 0;
// for (int i = 0; i < 32; ++i) {
// res = (res << 1) | (n & 1);
// n >>= 1;
// }
// return res;
// }
// };
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
n = (n >> 16) | (n << 16); //低16位与高16位交换
n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8); //每16位中低8位和高8位交换; 1111是f
n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4); //每8位中低4位和高4位交换;
n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2); //每4位中低2位和高2位交换; 1100是c,0011是3
n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1); //每2位中低1位和高1位交换; 1010是a,0101是5
return n;
}
};