常见位运算总结

article/2025/8/12 0:45:54

位运算

  • 常见位运算总结
    • 位1的个数
    • 比特位计数
    • 汉明距离
    • 只出现一次的数字

常见位运算总结

在这里插入图片描述

位1的个数

191. 位1的个数

给定一个正整数 n,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。
示例 1:
输入:n = 11
输出:3
解释:输入的二进制串 1011 中,共有 3 个设置位。
示例 2:
输入:n = 128
输出:1
解释:输入的二进制串 10000000 中,共有 1 个设置位。
示例 3:
输入:n = 2147483645
输出:30
解释:输入的二进制串 1111111111111111111111111111101 中,共有 30 个设置位。
提示:
1 <= n <= 231 - 1
进阶:
如果多次调用这个函数,你将如何优化你的算法?

方法一:逐位判断
根据 与运算 定义,设二进制数字 n ,则有:
若 n&1=0 ,则 n 二进制 最右一位 为 0 。
若 n&1=1 ,则 n 二进制 最右一位 为 1 。
根据以上特点,考虑以下 循环判断 :
判断 n 最右一位是否为 1 ,根据结果计数。
将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。

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

复杂度分析:
时间复杂度 O(logn) : 此算法循环内部仅有 移位、与、加 等基本运算,占用 O(1) ;逐位判断需循环 log2 n 次,其中 log2n 代表数字 n 最高位 1 的所在位数。
空间复杂度 O(1) : 变量 res 使用常数大小额外空间。
方法二:巧用 n&(n−1)
(n−1) 作用: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
n&(n−1) 作用: 二进制数字 n 最右边的 1 变成 0 ,其余不变。在这里插入图片描述

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

复杂度分析:
时间复杂度 O(M) : n&(n−1) 操作仅有减法和与运算,占用 O(1) ;设 M 为二进制数字 n 中 1 的个数,则需循环 M 次(每轮消去一个1),占用 O(M) 。
空间复杂度 O(1) : 变量 res 使用常数大小额外空间。

比特位计数

338. 比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
提示:
0 <= n <= 105
进阶:
很容易就能实现时间复杂度为 O(n log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount )

方法一:枚举二进制为1的位
对于任意整数 x,令 x=x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。
对于给定的 n,计算从 0 到 n 的每个整数的「一比特数」的时间都不会超过 O(logn),因此总时间复杂度为 O(nlogn)。

class Solution {public int[] countBits(int n) {int[] bits=new int[n+1];for(int i=0;i<=n;i++){int ones=0;int x=i;while(x>0){x&=(x-1);ones++;}bits[i]=ones;}return bits;}
}

复杂度分析
时间复杂度:O(nlogn)。需要对从 0 到 n 的每个整数使用计算「一比特数」,对于每个整数计算「一比特数」的时间都不会超过 O(logn)。
空间复杂度:O(1)。除了返回的数组以外,空间复杂度为常数。
方法二:动态规划——最低设置位
定义正整数 x 的「最低设置位」为 x 的二进制表示中的最低的 1 所在位。例如,10 的二进制表示是 1010 (2) ,其最低设置位为 2,对应的二进制表示是 10 (2) 。
令 y=x & (x−1),则 y 为将 x 的最低设置位从 1 变成 0 之后的数,显然 0≤y<x,bits[x]=bits[y]+1。因此对任意正整数 x,都有 bits[x]=bits[x & (x−1)]+1。
遍历从 1 到 n 的每个正整数 i,计算 bits 的值。最终得到的数组 bits 即为答案。

class Solution {public int[] countBits(int n) {int[] bits = new int[n + 1];for (int i = 1; i <= n; i++) {bits[i] = bits[i & (i - 1)] + 1;}return bits;}
}

复杂度分析
时间复杂度:O(n)。对于每个整数,只需要 O(1) 的时间计算「一比特数」。
空间复杂度:O(1)。除了返回的数组以外,空间复杂度为常数。

汉明距离

461. 汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例 1:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
示例 2:
输入:x = 3, y = 1
输出:1
提示:
0 <= x, y <= 231 - 1

前言
汉明距离广泛应用于多个领域。在编码理论中用于错误检测,在信息论中量化字符串之间的差异。
两个整数之间的汉明距离是对应位置上数字不同的位数。
根据以上定义,我们使用异或运算,记为 ⊕,当且仅当输入位不同时输出为 1。
计算 x 和 y 之间的汉明距离,可以先计算 x⊕y,然后统计结果中等于 1 的位数。
现在,原始问题转换为位计数问题。位计数有多种思路
方法一:内置位计数功能
思路及算法
大多数编程语言都内置了计算二进制表达中 1 的数量的函数。在工程中,我们应该直接使用内置函数。

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

复杂度分析
时间复杂度:O(1)。不同语言的实现方法不一,我们可以近似认为其时间复杂度为 O(1)。
空间复杂度:O(1)。
方法二:Brian Kernighan 算法
思路及算法
该算法可以被描述为这样一个结论:记 f(x) 表示 x 和 x−1 进行与运算所得的结果(即 f(x)=x & (x−1)),那么 f(x) 恰为 x 删去其二进制表示中最右侧的 1 的结果。
基于该算法,当我们计算出 s=x⊕y,只需要不断让 s=f(s),直到 s=0 即可。这样每循环一次,s 都会删去其二进制表示中最右侧的 1,最终循环的次数即为 s 的二进制表示中 1 的数量。

class Solution {public int hammingDistance(int x, int y) {int s = x ^ y, ret = 0;while (s != 0) {s &= s - 1;ret++;}return ret;}
}

复杂度分析
时间复杂度:O(logC),其中 C 是元素的数据范围,在本题中 logC=log231 =31
空间复杂度:O(1)
lowbit
熟悉树状数组的同学都知道,lowbit 可以快速求得 x 二进制表示中最低位 1 表示的值。
因此我们可以先将 x 和 y 进行异或,再统计异或结果中 1 的个数。

class Solution {int lowbit(int x) {return x & -x;}public int hammingDistance(int x, int y) {int ans = 0;for (int i = x ^ y; i > 0; i -= lowbit(i)) ans++;return ans;}
}

时间复杂度:O( C ),C 最多为 32
空间复杂度:O(1)

只出现一次的数字

136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
除了某个元素只出现一次以外,其余每个元素均出现两次。

方法一:位运算
如果不考虑时间复杂度和空间复杂度的限制,这道题有很多种解法,可能的解法有如下几种。

  • 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。
  • 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。
  • 使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。

上述三种解法都需要额外使用 O(n) 的空间,其中 n 是数组长度。
如何才能做到线性时间复杂度和常数空间复杂度呢?
答案是使用位运算。对于这道题,可使用异或运算 ⊕。异或运算有以下三个性质。

  • 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
  • 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
  • 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
class Solution {public int singleNumber(int[] nums) {int single = 0;for (int num : nums) {single ^= num;}return single;}
}

复杂度分析
时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。
空间复杂度:O(1)。


http://www.hkcw.cn/article/KDQnZusdcH.shtml

相关文章

离散化算法的二分法应用

我们思考一个问题&#xff1a;其实这里的二分法回归本源也是基于下标映射的原理&#xff0c;只是实现是借助二分的形式。 在排序好的数组中对目标数值进行二分搜索&#xff0c;在 O(logn) 的时间复杂度内找到该数值是整体数据中的第几个。 具体的我们可以如下操作&#xff1a; …

字节流操作:InputStream类 读取文件的操作(三种 read 方法)

字节流操作&#xff1a;InputStream类 和 OutputStream类 文章目录 字节流操作&#xff1a;InputStream类 和 OutputStream类观前提醒&#xff1a;InputStream类 读取文件的操作&#xff08;三种 read 方法&#xff09;1. 不带参数的 read( )方法&#xff0c;返回值是&#xff…

day13 leetcode-hot100-22(链表1)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 1.哈希集合HashSet 思路 &#xff08;1&#xff09;将A链的所有数据存储到HashSet中。 &#xff08;2&#xff09;遍历B链&#xff0c;找到是否在A中存在。 具体代码 /*** Definition for singly-linked list.* pu…

《在人间》葛铮:以无言演绎孤独,肢体语言传递情绪

如何塑造一个全剧中几乎没有台词的角色?葛铮认为关键在于认真体验角色的内心,由心而发地去感受,在镜头前自然地表现。5月28日,他出演的高概念意象情感剧《在人间》播出,他在剧中饰演铁林一角,多数镜头中只能用肢体语言、面部表情等方式传递角色的情绪,这对葛铮来说无疑是…

【docker部署】 Windows版docker部署harbor镜像

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Windows版docker部署harbor镜像 Windows版dock…

TopCode之手撕快排

题目链接 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 使用数组分三块的思想 i用来遍历整个数组 left用来标记<key的边界 right用来标记>key的边界 然后i进行遍历,数组就分成了四块 [l,left]<key [left1,i-1]key [i,right-1]未…

vue2使用node版本启动差异

node 14.21.3启动 无需添加去除ssl的环境变量&#xff0c;npm run dev即可 node 20.12.2 版本需要添加 SET NODE_OPTIONS–openssl-legacy-provider && "dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve"其…

母亲多种工具打孩子10多次被立案 强制报告制度显效

近日,司法部发布了一起未成年人法律援助典型案例。江苏省某小学老师发现学生胡某某身上有多处新旧伤痕,询问后得知胡某某因不愿意上学等问题被母亲多次殴打。老师随即按照强制报告制度要求向检察机关报告。经鉴定,胡某某挫伤面积达体表面积8%,已构成轻伤一级。随后,其母亲…

多家银行5年期定存利率跌破1.3% “存5年不如存1年”现象频现

离新一轮存款降息仅过去10天,部分中小银行存款利率开始出现剧烈调整。5月30日,多家农商行、村镇银行集体宣布下调定期存款利率。五年期整存整取利率最低降至1.20%,已低于六家国有大行、招商银行等大行1.30%的存款挂牌利率水平。“存5年不如存1年”这样的现象在中小银行中并不…

塞尔维亚一军工厂突发爆炸致7人受伤 工人制作炸药时意外引爆

当地时间30日早上7时40分,塞尔维亚军工企业“克鲁希克”位于瓦列沃市的工厂发生爆炸事故,导致7名工人受伤送医。伤者均为轻伤,已出院居家休养。事故发生在工人制作军用炸药过程中,压机上的引信被意外激活引发爆炸。有1名工人头部受伤,4人出现耳鸣症状。爆炸发生后厂区秩序…

专家解读印度“阵风”折翼背后较量 体系战斗力的较量

印巴冲突中,双方出动了大批战机进行猛烈交火。过去,印巴冲突多为地面战斗,而此次出现了大规模空中作战。这不仅是双方作战平台性能的直接较量,更是两国空战体系的深层碰撞。5月7日,印度武装部队发起代号为“朱砂”的行动,打击巴基斯坦和巴控克什米尔地区的设施。随后,巴…

长沙有花店将艾草花束卖到98元 节日氛围推高需求

端午节除了吃粽子,中国人还有在门口挂艾草的习俗。为了了解长沙市场上艾草的供应情况和价格,记者进行了走访。主打节日氛围的艾草出现在了超市和花店,经过商家精心搭配后成为一束束艾草花束。在河西的一家盒马超市内,摆放着多款艾草花束,价格从19.9元到39.9元不等。盒马相…

买到演唱会铁窗视角票被退款 视野不良引争议

近日,网友小鱼在京观看某明星演唱会时遭遇了视野被遮挡的问题。她表示,自己花费1960元购买了两张票,但到达现场后发现看台边缘的护栏遮住了大半个舞台,导致视线受阻。小鱼立即向工作人员反映情况并要求换座,但被告知没有空位。随后,小鱼录下了座位视角的视频,并找到多名…

王毅会见瑞士联邦委员兼外长卡西斯 共促国际调解院发展

2025年5月30日下午,中共中央政治局委员、外交部长王毅在香港会见了出席国际调解院公约签署仪式的瑞士联邦委员兼外长卡西斯。王毅表示,卡西斯专程来港参加此次活动,体现了瑞士对建立国际调解院的支持以及在多边主义和对话协商化解分歧方面的积极态度。中方赞赏瑞士在国际事务…

顺丰回应5万元手镯仅赔67元 未保价引发争议

5月30日,话题“顺丰寄丢价值5万元手镯仅赔67元”引发热议,登上微博热搜。近日广东佛山陈小姐网购了一只价值4.98万元的翡翠手镯,收到货后不太满意,选择了退货退款。因为商家赠送了运费险,5月22日10点由指定的顺丰速运上门取件。23日晚,陈小姐接到快递员电话,称快件丢失了…

长沙有花店将艾草花束卖98元 节日氛围带动热销

端午节期间,除了吃粽子,中国人还有在门口挂艾草的习俗。5月29日,对长沙市场进行了走访。主打节日氛围的艾草出现在了超市、花店,商家将其精心搭配成一束束艾草花束。河西的一盒马超市内,角落摆放着多款艾草花束,价格从19.9元到39.9元不等。盒马相关人士表示,艾草花束这周…

腾讯高管辟谣微信已读及访客功能 反复翻炒流量引质疑

腾讯高管辟谣微信已读及访客功能 反复翻炒流量引质疑!腾讯公关总监张军针对“微信如果推出朋友圈访客”和“如果微信推出已读功能”两个热门话题进行了辟谣。他表示,不明白为何总有人反反复复地创造“如果”,前两天所谓的朋友圈访客功能也是缘起于此。他甚至怀疑,有人在特意…

男子在商场猥亵女店员 店长飞身锁喉一招制服 正义店长挺身而出

男子在商场猥亵女店员店长飞身锁喉一招制服!在湖北襄阳的一家烧烤店,一名女店员正在门口发传单迎接客人时,一名戴着头盔的黑衣男子停下脚步,突然伸出“咸猪手”摸向她的腰。女子质问对方为何碰她,却反被殴打。监控视频显示,女子推开男子并质问他,但对方不仅没有道歉,反…

中国学生在哈佛毕业典礼发表演讲 传递多元包容理念

中国学生在哈佛毕业典礼发表演讲 传递多元包容理念!5月29日,哈佛大学举行毕业典礼,来自中国青岛的江玉蓉作为毕业生代表之一发表演讲。江玉蓉成长于普通家庭,通过自身努力和天赋获得了威尔士卡迪夫一所高中的全额奖学金,并在杜克大学完成本科教育后进入哈佛大学肯尼迪学院…

博主解读福建舰核心数据,福建舰第八次海试传来硬货!

博主解读福建舰核心数据。5月24日,央视新闻正式官宣:福建舰第八次海试传来硬货!电磁弹射系统直接让美军福特号成了"反面教材"。咱用的中压直流技术有多狠?美军福特号磨了7年还在修弹射故障,福建舰测试效率直接快3倍,故障率还不到他们的1/5。甲板上歼-15T挂着实…