0%

算法

位运算

  1. 2的幂

最右侧的1: `rightOne = m & (-m);

1
2
3
4
5
6
7
8
9
10
​```cpp
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n == 0) return false;
long m = (long)n;
long rightOne = m & (-m); //找到该数最右侧的1
return rightOne == m ? true : false;
}
};
  1. 大于等于某个数的最大2的幂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
bool NearTwoPower(int n) {
if (n <= 0) return 1;
n--; // 此处减一的目的是能够返回等于2的幂的数
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n + 1;

//n = 00100000
// 00011111 (--)
// 00001111 (>>1)
//n = 00011111
//...
}
}

  1. 区间与的结果
1
2
3
4
5
6
7
8
9
10
class Solution {

public:
    int rangeBitwiseAnd(int left, int right) {
        while (left < right) {
            right -= right & -right; //每次去掉最右侧的1
        }
        return right;
    }
};
  1. 数字逆序
    分治依次1/2/4/8交换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Solution {
    public:
    int ReverseNum (int n) {
    n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1);
    n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2);
    n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4);
    n = ((n & 0xFF00FF00) >> 8) | ((n & 0X00FF00FF) << 8);
    n = (n>> 16) | (n << 16);
    return n;
    }
    }
-------------到底咯QAQ嘎嘎-------------