位运算
文章平均质量分 53
神奇操作
山顶夕景
实践出真知
展开
-
【LeetCode剑指offer65】不用加减乘除做加法(位运算)
文章目录一、题目二、思路三、代码一、题目二、思路(a & b) << 1能够计算a和b的所有进位值;a ^ b则是计算a和b的各位相加(不管进位值)因为不能使用加法运算符,所以上面两项的结果也不能用加法,只能循环上面的步骤计算。三、代码class Solution {public: int add(int temp_sum, int jinwei) { //不能使用+号,所以求出异或部分和进位部分后依然不能使用+号 //所以只原创 2022-04-06 10:01:15 · 1170 阅读 · 1 评论 -
【LeetCode137】只出现一次的数字 II(每个数的第j列元素相加余3)
一、题目二、思路审题nums[i]都在int范围内(32位二进制),对于每个num[i]的二进制数,对于第j个位置的元素都相加,并且最后对结果的二进制数,其第j个位置的元素依次进行余3操作。关键:对于数组中的每一个元素 x,我们使用位运算 (x>>i)(x >> i)(x>>i) & 111 得到 x 的第 i 个二进制位。注意计算2的i次方可以使用1 << i。举栗子:如果输入是:nums = [2,2,3,2],那么它的各个元素对原创 2022-02-25 11:19:01 · 640 阅读 · 0 评论 -
【LeetCode231】2的幂(n & (n - 1) == 0或n & (-n) == n)
文章目录一、题目二、思路三、代码一、题目二、思路要是2的幂,可以回想二进制数中,什么样的二进制数对应的十进制是2的幂呢,就是在二进制数中,只有一个1,其余都是0。所以我们只需要判断给定的数的二进制数,如果只有一个1则返回true了。位运算的技巧:n & (n - 1)可以将n的二进制位的最低位1移除。如1000和0111做与运算后得到0000,即将1000的最低位的1移除了,然后再判断其余位是否都是0。所以我们可以n > 0 && (n & (n -原创 2022-02-25 09:41:38 · 847 阅读 · 0 评论 -
【LeetCode260】只出现一次的数字 III(分组是关键,位运算)
一、题目二、思路如果我们把数组分成两个子数组,每个数组都满足「恰好有一个元素只出现一次,其余所有元素均出现两次」,就可以按照之前的方法直接解决了。(1)直接遍历一遍数组并逐一【异或】一定可以得到那两个不同元素的异或。如数组[2,2,1,1,3,4]。这个数组的异或值最终是3 与 4 的异或值为 div = 0011 ^ 0100 = 0111。(2)取最低位置的 ‘1’来进行对 a 与 b 的分组div &= -div;-div = 1000 + 0001 = 1001 (将div所有原创 2022-02-23 21:04:45 · 722 阅读 · 0 评论 -
腾讯高频题:IP地址与int整数的转换(位运算)
一、题目给你一个IP4的地址,请转成十进制整数 (2021-03 腾讯-PCG-前端)手撕算法: ip地址转整数 (2021-03 腾讯-TEG-后端)ip字符串转整型(2021-02 快手-效率工程-后端)例如,ip地址为10.0.3.193,把每段拆分成一个二进制形式组合起来为00001010 00000000 00000011 11000001,然后把这个二进制数转变成十进制整数就是167773121。另外:如何将十进制整数转为IP4地址。二、思路(1)IP地址转为int整数如IP原创 2021-11-07 12:21:44 · 876 阅读 · 1 评论 -
【LeetCode338】比特位计数(k&=(k-1)实现去掉右边的1)
1.题目2.思路k&=(k-1)实现每次去掉最右边的1,从而统计出每个数的二进制的1的个数。位运算的技巧还有异或等(【LeetCode136】只出现一次的数字(不能用哈希,用位运算-异或))。3.代码class Solution {public: int count(int k){ int cnt=0;//置0 while(k>0){ cnt++;//1的个数增加 k&=(k-1);/原创 2021-04-09 15:29:17 · 708 阅读 · 0 评论 -
【LeetCode461】汉明距离(easy位运算)
1.题目2.思路又水一题。。我都羞愧了。这题用异或处理,相同的二进制位为1,不同为0,最后统计1的个数即所求。bitset类似数组,只能放0或1,其常用的函数有: count() 返回有多少个1 any() 判断是否至少有一个1 none() 判断是否全为0 set() 把所有位置成1 set(k, v) 将第k位变成v reset() 把所有位变成0 flip() 等价于~ flip(k) 把第k位取反3.代码clas原创 2021-02-10 23:49:08 · 680 阅读 · 0 评论 -
【LeetCode136】只出现一次的数字(不能用哈希,用位运算-异或)
1.题目2.思路如果没有空间复杂度的要求,那肯定用哈希了,但是这题要求“线性时间复杂度、常数空间复杂度”,不使用额外空间。根据具体题目特性:除了那个只出现1次的元素,其他元素都是出现2次的——2次!2次!!,“异或”运算就是“二进制比较,相同为0,不同为1”,而其实==“异或”也有交换律和结合律==:若将所有出现2次的元素“异或”起来得到二进制的一坨0,最后再和出现1次的元素“异或”运算(某数和0异或还是该数)得到这个出现1次的元素。【位运算】是一种“骚”操作,之前根据数字二进制下 1 的数目排原创 2021-02-08 23:47:31 · 727 阅读 · 0 评论