呃。。。总是忘记用位运算,导致写的很麻烦
题目一:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例 1:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnyode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
int hammingDistance(int x, int y){
int a= x ^ y;
int ans=0;
while(a){
ans+= a & 1;
a>>=1;
}
return ans;
}
题目二:位运算分治
颠倒给定的 32 位无符号整数的二进制位。
思路分析:
让32个数字反转,先是奇数和偶数交换,然后两个两个交换,接着四个四个交换,八个八个交换,十六个十六个交换,这就是所谓的分治。
位运算分治代码:
class Solution {
private:
const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101
const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011
const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111
public:
uint32_t reverseBits(uint32_t n) {
n = n >> 1 & M1 | (n & M1) << 1; //1.
n = n >> 2 & M2 | (n & M2) << 2; //2.
n = n >> 4 & M4 | (n & M4) << 4; //3.
n = n >> 8 & M8 | (n & M8) << 8; //4.
return n >> 16 | n << 16;
}
};
理解:n>>1 偶数位移到奇数位,与M1与就是保留现在的奇数位,就是原来的偶数位,n&M1就是保留原来的奇数位,左移,到偶数位,这样两个结果或运算就是实现了奇偶交换。下面的就同理了,这样的效率