【问题描述】[简单]

【解答思路】

1. 内置位计数功能

时间复杂度:O(1) 空间复杂度:O(1)

class Solution {public int hammingDistance(int x, int y) {return Integer.bitCount(x ^ y); }
}
2. 移位

时间复杂度:O(1) 空间复杂度:O(1)

class Solution {public int hammingDistance(int x, int y) {int xor = x ^ y;int distance = 0;while (xor != 0) {if (xor % 2 == 1)distance += 1;xor = xor >> 1;}return distance;}
}
3. 布赖恩·克尼根算法 Brian Kernighan

时间复杂度:O(1) 空间复杂度:O(1)

class Solution {public int hammingDistance(int x, int y) {int xor = x ^ y;int distance = 0;while (xor != 0) {distance += 1;// remove the rightmost bit of '1'xor = xor & (xor - 1);}return distance;}
}

【总结】

1. 汉明距离

2. 位运算

异或运算(^)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
5 ^ 1 = 0101 ^ 0001 = 0100 = 4
5 ^ 3 = 0101 ^ 0011 = 0110 = 6
用法

  1. 翻转指定位 对应位异或1
    X=10101110,使X低4位翻转,用X ^0000 1111 = 1010 0001即可得到。
  2. 两个数是否相等 ==0
    5 ^ 5 = 0101 ^ 0101 = 0000 = 0

与运算(&)
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
5 & 1 = 0101 & 0001 = 0001 = 1
5 & 2 = 0101 & 0010 = 0000 = 0
用法
取指定位 对应位与1
设X=10101110,
取X的低4位,用 X & 0000 1111 = 00001110 即可得到;

或运算(|)
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1
用法:
指定位置置1 对应位或1
将X=10100000的低4位置1 ,用X | 0000 1111 = 1010 1111即可得到

取反运算(~)
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0

带符号左移运算(<<)
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2(右边补0)
3 << 1 = 0011 <<1 = 0110 = 6
带符号右移运算(>>)
正数操作数每右移一位,相当于该数除以2
(左补0 or 补1得看被移数是正还是负)
5 >> 1 = 0101 >> 1 = 0010 = 2
5 >> 2 = 0101 >> 2 = 0001 = 1
-14 >> 2 = 11110010 >> 2 = 11111100 = -4
无符号右移运算(>>>)
5 >>> 1 = 0101 >>> 1 = 0010 = 2
-14 >>>2 =11111111 11111111 1111111111110010 >>>2 = 00111111 11111111 1111111111111100 = 1073741820
移位总结

  • 正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。
  • 负数的右移,就是补码高位补1,然后按位取反加1即可。
3. 位运算 判相等换位异或^ 取位与&1 置位或|1
4. Brian Kernighan算法

n&(n-1) //n二进制最右位的 1 置 0

相关题目Brian Kernighan算法
[Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]

转载链接:https://leetcode-cn.com/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode/

[Leetcode][第461题][JAVA][汉明距离][位运算][Brian Kernighan]相关推荐

  1. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  2. [Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]

    [问题描述][中等] [解答思路] 1. 暴力 逐位与 ,只需要判断i= 0 或 i == 2147483647 的话,就跳出 for 循环即可. 时间复杂度:O(N) 空间复杂度:O(1) publ ...

  3. [Leedcode][JAVA][第67题][二进制求和][位运算][字符串]

    [问题描述][简单] 给你两个二进制字符串,返回它们的和(用二进制表示).输入为 非空 字符串且只包含数字 1 和 0.示例 1:输入: a = "11", b = "1 ...

  4. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  5. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  6. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  7. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  8. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  9. [Leetcode][第216题][JAVA][数组之和3][回溯]

    [问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...

最新文章

  1. Algorithm:【Algorithm算法进阶之路】之数据结构基础知识
  2. 软件工程(2019)结对编程第二次作业
  3. 更新node最新版本方法和 npm install -g n 运行错误
  4. 爬虫侵入计算机系统,【探讨】利用“爬虫技术”获取数据行为的刑事考量 ——以一起非法获取计算机信息系统数据案为例...
  5. 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)
  6. 星空背景JavaScript代码
  7. Android MTK 6763 User 版本默认打开usb调试
  8. unity3d赛车游戏视频教程
  9. Java List retainAll方法使用注意事项
  10. WINCE ROM 定制大教程
  11. word文档中在文字的右上角加标注快捷键
  12. 双活数据中心解决方案
  13. CallBack函数调用
  14. 西门子840Dsl系统的刀具列表数据采集
  15. nginx配置及基本优化
  16. 成都计算机系统维护专业中专,成都计算机应用专业中专招生简章
  17. iframe子页面调用父页面javascript函数的方法
  18. Linux apr-util安装
  19. 软件测试之计算机基础
  20. JS延时函数,格1秒触发

热门文章

  1. 11.SolrJ索引操作
  2. (HDU)1019 --Least Common Multiple(最小公倍数)
  3. 漫谈C++:良好的编程习惯与编程要点
  4. 作业3(学习进度表)【第四周】
  5. Android 各控件的使用 - 按钮(Button)
  6. 在虚拟机中安装和配配置 MOSS2007 全过程
  7. 传统图片验证算法的缺点及改进(原理篇)
  8. php 数组的定义方法,PHP中数组定义的几种方法
  9. Android中WebService的应用
  10. phaser设置图片资源大小