
时间复杂度:O(log n)
其实就是统计a和b异或后1的个数。
如果不借助于内置函数,可以用Brian Kernighan 算法,令异或后的结果每次都与自身减1做且运算(s&(s-1)),可以删除自身最右侧的1,通过删除次数统计1的个数。
借助于内置函数就是用OnesCount函数统计1的个数。
- func hammingDistance(x int, y int) (res int) {
- for s:=x^y;s>0;s&=s-1{
- res++//每次循环都会删去s中最右侧的1,故可以统计出1的个数
- }
- return res
- }
- func hammingDistance(x, y int) int {
- return bits.OnesCount(uint(x ^ y))
- }
学习到可以通过Brian Kernighan 算法统计二进制数中1的个数