前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >位运算–LC191– 位1的个数___LC231–2的幂___LC190– 颠倒二进制位__LC338– 比特位计数

位运算–LC191– 位1的个数___LC231–2的幂___LC190– 颠倒二进制位__LC338– 比特位计数

作者头像
Java架构师必看
修改于 2023-09-25 08:13:32
修改于 2023-09-25 08:13:32
50700
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

位运算的由来

在计算机里面,任何数据最终都是用数字来表示的(不管是我们平时用的软件,看的图片,视频,还是文字)。 并且计算机运算单元只认识高低电位,转化成我们认识的逻辑,也就是 0 1 。

这就是导致计算机里面任何数据最终都是用二进制(0 1)来保存的数字。只是我们平时看到的图片、文字、软件都只从二进行数字转化

而来的

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
利用上面提到的常用位操作:
x &= (x - 1)
从右往左,每次把最低位的 1 给打掉,并累加被打掉1的次数

如:


n     :   0B101011
n - 1 :   0B101010
------------------
&     :   0B101010


n     :   0B101000
n - 1 :   0B100111
------------------
&     :   0B100000

例题

191. 位1的个数

难度简单330

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'
解法一:

每次 打掉最后的一个 1 n &= n - 1 看有多少次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
   
    public int hammingWeight(int n) {
   
        int ret = 0;
        while (n != 0) {
   
            n &= n - 1;
            ret++;
        }
        return ret;
    }
}
解法二:

mark = 1;

  1. 在当前位置 当前位置是否为 1 n & mark 如果是一 计数加一
  2. mark <<= 1 向左移动一次…并判断左边的位置是否为一
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   int mark = 1;
        for (int i = 0; i < 32; i++) {
   
            if ((n & mark) != 0) {
   
                ret++;
            }
            mark <<= 1;
        }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
   
    public int hammingWeight(int n) {
   
        int ret = 0;
        int mark = 1;
        for (int i = 0; i < 32; i++) {
   
            if ((n & mark) != 0) {
   
                ret++;
            }
            mark <<= 1;
        }
        return ret;
    }
}

231. 2的幂

难度简单294

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 1
输出: true
解释: 2^0 = 1

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 16
输出: true
解释: 2^4 = 16
解题:
  • 由于是2的幂 由二进制的以得到:
  • 16 的 二进制为 0001 0000
  • 可以利用二进制的位运算的 n&(n-1) 打掉当前的数字二进制的最后一个零 判断是否零
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
   
       public boolean isPowerOfTwo(int n) {
   
        if (n > 0) {
      //注意判断数的争取 负数, 零为非法数字
          return  (n&(n-1))==0;
        }
        return false;
    }
}

190. 颠倒二进制位

难度简单281

颠倒给定的 32 位无符号整数的二进制位。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

相关解释动画

思路

  • res 要的数字 左移一位 吧最后一个位置空出来 用来 存放n的 最后的一个数值
  • 在 res 最后一位加上 n的 最后一个数字
  • n 往 右边 移动一个 把 最右边的数字 打掉
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
   
    public int reverseBits(int n) {
   
        int res = 0;
        for (int i = 0; i < 32; i++) {
   
            //res先往左移一位,把最后一个位置空出来,
            //用来存放n的最后一位数字
            res <<= 1;
            //res加上n的最后一位数字
            res |= n & 1;
            //n往右移一位,把最后一位数字去掉
            n >>= 1;
        }
        return res;
    }
}

338. 比特位计数

详细答案解说

难度中等688

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 2
输出: [0,1,1]

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 5
输出: [0,1,1,2,1,2]
方法一:直接计算

最直观的方法是对从 00 到 num 的每个数直接计算「一比特数」。

每个 int 型的数都可以用 32 位二进制数表示,只要遍历其二进制表示的每一位即可得到 1 的数目。

利用位运算的技巧,可以在一定程度上提升计算速度。按位与运算(&)的一个性质是:对于任意整数 x,令 x=x&(x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 xx 重复该操作,直到 x 变成 0,则操作次数即为 x的「一比特数」。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
   
     public int[] countBits(int num) {
   
        int[] bites = new int[num + 1];

        for (int i = 0; i < num+1; i++) {
   
            bites[i] = countOnes(i);
        }
        return bites;
    }
    

    private int countOnes(int i) {
   
        int count = 0;
        while (i > 0) {
   
            i &= (i - 1);
            count++;
        }
        return count;
    }
}
动态规划——最低设置位
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
   
    public int[] countBits(int num) {
   
        int[] bits = new int[num + 1];
        for (int i = 1; i < num + 1; i++) {
   
            bits[i] = bits[i & (i - 1)] + 1;
        }
        return  bits;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
190. 颠倒二进制位
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
lucifer210
2019/08/16
5790
位运算-LeetCode 191、190、7、338、461
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
算法工程师之路
2019/11/14
4970
190 颠倒二进制位
首先嘛肯定是要想出通过某种组合位运算的方式来达到目的,通过位运算是直接操作的这个数字在当前语言的二进制串,否则通过循环模拟二进制串对于Java还要分正负最终还转成数字过程就有点笨重了。
木瓜煲鸡脚
2021/11/02
7720
LeetCode 190. 颠倒二进制位(位运算)
1. 题目 颠倒给定的 32 位无符号整数的二进制位。 示例 1: 输入: 00000010100101000001111010011100 输出: 00111001011110000010100101000000 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192, 其二进制表示形式为 00111001011110000010100101000000。 示例 2: 输入:11111111
Michael阿明
2020/07/13
4240
​LeetCode刷题实战190:颠倒二进制位
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/03/04
4220
颠倒二进制位(C++)
对应我的掘金文章:https://juejin.cn/post/7147269894382288927
GeekLiHua
2025/01/21
740
【Leetcode-190.颠倒二进制位 -191.位1的个数 -202.快乐数】
输入:n = 00000010100101000001111010011100 输出:964176192(00111001011110000010100101000000) 解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
YoungMLet
2024/03/01
940
LeetCode-190. 颠倒二进制位(java)
        一看到这题,整个人第一眼傻了,这读完一遍题,不知所云,于是乎接着理题。仔细看下示例,其实就是道翻转题,只不过它是32位值,我为了让大家看的更清楚,给大家举个简单的十进制示例,比如:
bug菌
2023/05/27
2350
LeetCode-190. 颠倒二进制位(java)
Leetcode No.190 颠倒二进制位
示例 1: 输入: 00000010100101000001111010011100 输出: 00111001011110000010100101000000 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
week
2021/05/06
3270
190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。 示例: 输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。 进阶: 如果多次调用这个函数,你将如何优化你的算法? 解: public class Solution { // you need treat n as a
张伦聪zhangluncong
2022/10/26
2550
☆打卡算法☆LeetCode 190. 颠倒二进制位 算法解析
可以将这个二进制位看成一个二进制串,然后从低位到高位进行遍历枚举,然后将其倒序的插入到int数据对象中。
恬静的小魔龙
2022/09/21
2170
☆打卡算法☆LeetCode 190. 颠倒二进制位 算法解析
(Leetcode 2021 刷题计划) 190. 颠倒二进制位
解题思路: 针对该题, 第一个思路是将其转化为字符串(to_string), 然后直接反转(reverse), 一顿操作结果发现思路不对, 直接采用这种模拟的方法通关。
windism
2021/03/29
4580
【LeetCode每日一题】190. 颠倒二进制位
今日题目190题,相关题目7、9两道题,一起带进来刷,每日一题微信交流群可以点击右下角:合作转载->联系我,拉你入群。
公众号guangcity
2021/03/30
6950
【一天一道Leetcode】颠倒二进制位
我们可以将输入num视为一个长为32的二进制串,从高往低枚举num的每一位,通过取余的形式判断该位数是否数值为1。
潘永斌
2021/04/20
3240
【一天一道Leetcode】颠倒二进制位
【LeetCode】190. 颠倒二进制位
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
韩旭051
2020/06/23
3190
LeetCode-算法-位运算-第14天
思路:for i in range(0,32)表示循环次数32次。(n&1)之前了解过,只保留当前n最右侧一位,(n&1)<<(31-i),的意思是将最右侧一位左移(31-i)。此时rev按位|与,从而使最高位获取到n最右侧一位。同理,第二次循环则是左侧第二位获取n的右侧第二位。 这里以8位的二进制,则相对应的为(n&1)<<(7-i)来举个例子: 第一次循环n=181二进制1011 0101,n&1=0000 0001,通过左移位7位,可以看出变为1000 0000,此处的1是1011 0101的最后一位的1。最后rev 0000 0000 与1000 0000按位与,则rev=1000 0000。之后n=n>>1=0101 1010。 第二次循环n&1=0000 0000通过左移7-i=6位,则变为0000 0000,最后与rev 1000 0000按位与则rev=1000 0000,n=n>>1=0010 1101。最终通过循环结束得到rev为1010 1101。
布衣者
2021/09/07
3280
☆打卡算法☆LeetCode 191. 位1的个数 算法解析
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
恬静的小魔龙
2022/09/21
2280
☆打卡算法☆LeetCode 191. 位1的个数 算法解析
LeetCode笔记:190. Reverse Bits
一开始用笨办法先一位位转化成代表二进制数的数组然后重新计算出结果,但是题目给出的是32位无符号数,也就是说大于int型的范围了,很麻烦。
Cloudox
2021/11/23
2470
剑指 offer|15. 二进制中1的个数
这道题,可能比较容易想到的就是使用 “与”运算符&的特点( 只有1 & 1的时候等于1)。逐步对二进制的最后一位进行&1的操作,结果为1,则表示含有1,统计数加1 。每次&1操作之后,该数字右移1位。直到这个数为0后停止。
孟君
2022/11/21
2820
剑指 offer|15. 二进制中1的个数
用javascript分类刷leetcode--位运算(图文视频讲解)
程序中所有的数载计算机内存中都是以二进制存储的,位运算就是直接对整数在内存中的二进制进行操作,由于直接在内存中进行操作,不需要转成十进制,因此处理速度非常快
hellocoder2028
2022/12/20
6190
相关推荐
190. 颠倒二进制位
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验