【问题描述】[简单]

请实现一个函数,输入一个整数(无符号数),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

【解答思路】

1. 逐位判断


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

  public int hammingWeight(int n) {int res = 0;while(n != 0) {res += n & 1;n >>>= 1;}return res;}
2. 巧用 n&(n−1)

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

public class Solution {public int hammingWeight(int n) {int res = 0;while(n != 0) {res++;n &= n - 1;}return res;}
}

【总结】

1.只能针对正数
 public int hammingWeight(int n) {int num=0;while(n!=0){if(n%2 ==1){num++;}n/=2;}return num;}
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
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

转载链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/solution/mian-shi-ti-15-er-jin-zhi-zhong-1de-ge-shu-wei-yun/

[剑指offer][JAVA]面试题第[15]题[二进制中1的个数][位运算]相关推荐

  1. [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组]

    [问题描述][中等] 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  2. [剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]

    [问题描述][中等] 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.参考以下这颗二叉搜索树:5/ ...

  3. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

  4. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  5. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  6. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  7. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  8. [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]

    [问题描述][中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,给出前序遍历 preorder = [3,9,20,15,7] ...

  9. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

最新文章

  1. hashtable、hashmap、ConcurrentHashMap、treemap的区别
  2. Markdown 语法说明 (简体中文版)
  3. 【攻防世界001】Guess-the-Number
  4. 入门 | 初学者必读:解读14个深度学习关键词
  5. 撑起百万亿参数模型想象力!英伟达发布新一代SuperPOD超算,AI算力新巅峰!
  6. 张勇云栖连讲三年,阿里云十年一剑,王者归来
  7. XShell提示Connection closed by foreign host的问题 和 路由器分配IP的规则
  8. 【leetcode】20. Valid Parentheses
  9. 08.第三章 数字特征与特征函数(1)
  10. [教程] 基于时间盲注的python3脚本编写
  11. WLAN RTT (IEEE 802.11mc)
  12. css向右箭头形状按钮,详解Bootstrap的纯CSS3箭头按钮样式
  13. AAC的ADTS头解析
  14. golang_微信公众号网页授权
  15. 卢克,学着去读源代码
  16. 2022年金属非金属矿井通风上岗证题库及模拟考试
  17. Netconf配置及其RPC和Notification下发流程解析
  18. 计算圆,球,圆锥,圆柱的表面积与体积
  19. 奇虎360嵌入式实习面试面经
  20. 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题

热门文章

  1. WinAPI: midiOutGetID - 获取输出设备 ID
  2. MyEclipse2015双击不能打开文件
  3. Centos7搭建Java环境,并设置项目自启动脚本、定时数据库备份/日志清理脚本
  4. 博客园文章方块背景格式
  5. Android 设备启动时,APP应用自启动
  6. Android 上传图片实例,java上传图片接口
  7. java、Android 数组转集合
  8. 阻止html页面加载,如何防止页面加载重复的JS?
  9. c语言函数调用参数调用的太少,浅谈C语言函数调用参数压栈的相关问题
  10. linux如何记录测试时长,如何测试Linux命令运行时间?