![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
位运算
baixiaofei567
如果十年前没种树,那最好的时间是现在
展开
-
477. 汉明距离总和
一开始暴力了,想想就不行,立方级别的时间复杂度肯定不行的。不用两两异或,通过统计这个数组中每一位的1的个数和0的个数即可。因为是有范围不大于10^9也就是2 ^30,所以我们只要遍历0到30位就行,用每一位上的1的个数和0的个数相乘,就是这一位上能提供的所有汉明距离的和。1就是(val>>i)&1,0的个数就是n-c。为什么是0和1的相乘,就相当于做一个组合运算,用这一位是1的数字和另一个这一位是0的数字异或才能提供11的汉明距离,所以只要0的个数1的个数就是这一位所能提供的汉明距.原创 2021-05-29 00:02:50 · 142 阅读 · 0 评论 -
1486. 数组异或操作
0到n-1就这样class Solution {public: int xorOperation(int n, int start) { //先求出每一位,然后依次异或,异或^相同为0,不同为1,所以一开始和0异或 int res = 0; //下标从0开始,到n-1很重要 for(int i = 0; i < n; ++i){ res ^= (start + 2*i); } .原创 2021-05-08 00:17:47 · 149 阅读 · 0 评论 -
1720. 解码异或后的数组
先将first加入数组,然后遍历encoded,每一轮将res[i]和encoded[i]做异或的结果加入res。class Solution {public: vector<int> decode(vector<int>& encoded, int first) { //xor就是异或 //异或^,相同为0,不同为1,与运算&,全1为1,其余未0,|或运算,全0为0,其余为1 //根据first慢慢推,a.原创 2021-05-08 00:16:04 · 101 阅读 · 0 评论 -
371. 两整数之和
真的是很不错的题,注意要将a&b左移的结果转成无符号整数防止溢出(虽然我也不懂hhh)class Solution {public: int getSum(int a, int b) { //^异或,相同为0,不同为1,所以01就是1,00和11都是0,可以用来模拟没有进位的加法 //&与运算,全1为1,可以用&来算进位,&之后为1的位置证明这一位有进位,再对其<<1之后就将进位放到了应该去的位置,当完全没有进位了,就.原创 2021-04-04 01:18:56 · 118 阅读 · 0 评论 -
476. 数字的补数
笨人笨方法,注意没有前导0这个条件。特殊情况,num==0输出1补码就是对自身取反,为什么~是不对的呢,因为这是考虑了有前导0的情况的,比如2,没有前导0就是10,补码就是01,如果有前导0的情况,取补码就是1111111111111…01这样了我们先算出num有几位,然后用num来算res,将num的第一位给res的最后一位,如果第一位是1,res最后一位就是0。然后再左移res,最后res的最后一位就到第一位啦class Solution {public: int findCompl.原创 2021-04-04 01:16:48 · 151 阅读 · 0 评论 -
693. 交替位二进制数
暴力做就算了,一位一位和前面比较,不要耍小聪明一次跳两位class Solution {public: bool hasAlternatingBits(int n) { //移位运算符就行了,每次移动两位 //移动两位不行,比如0110,那么01不同,10也不同,但是11是相同的,还是得一位一位来 int pre = n & 1; n >>= 1; while(n != 0){ .原创 2021-04-03 01:14:49 · 126 阅读 · 0 评论 -
342. 4的幂
和2的幂类似,多一个条件,那就是1的出现位置是在奇数位上,可以用n%3==1来判断,n%3 ==2就是偶数位class Solution {public: bool isPowerOfFour(int n) { //首先4的幂一定是2的幂 //不用递归或者循环就是位运算 //4的幂也只有1个1,我们要在判断它是否是2的幂的情况下,判断它的1在第几位,如果在奇数位就是对的,但是要找出1在第几位,又要用循环 //可以用n%3==1来判.原创 2021-04-03 01:13:44 · 100 阅读 · 0 评论 -
231. 2的幂
没做过就做不来,做过了就做得来的easy题法一:一力降十会法二:考虑位运算,2的幂次,只有1个1,n-1之后,除了当前这个1变为0,其余全变为1,这是充要条件,如果进行&运算后为1,证明它是2的幂。tips:==的优先级大于&class Solution {public: bool isPowerOfTwo(int n) { //要不要考虑负数或者0的情况,还有小数 //负数以及0,2不管怎么样都达不到的,所以直接false .原创 2021-04-03 01:12:41 · 134 阅读 · 0 评论 -
190. 颠倒二进制位
搞清楚三点,1.>>和<<的含义,2.32位二进制数一定有32个数字,前面会补0,3.n&1就是求n的最后一位数字这三点搞懂就很简单了,0001<<=1的结果是0010,0010>>=的结果是0001。所以只要从0遍历到32,也就是遍历32次,res每次左移一位,然后加上n的最后一位,res初始化为0,这样n的后面的就在res的前面了,然后n右移一位,因为最后一位被处理过了就不要了。class Solution {public: ui.原创 2021-02-10 01:23:04 · 118 阅读 · 0 评论 -
268. 丢失的数字
1.抽屉法放回原位,但是要考虑越界和重复,越界要放在最前面判断。2.用异或来做,如果存在1,那么1 ^ 1的结果就是0,0^某个数就等于某个数,我们从0遍历到nums.size()-1,将res分别和我们需要的按顺序的数字以及实际拥有的数字做异或操作,如果我们需要的数字实际也拥有,那么同时异或就会得到0,最后剩下的就是我们缺少的。我们将res一开始设为nums.size(),这样如果都不缺,输出的就是n了class Solution {public: int missingNumber(..原创 2021-04-02 01:36:50 · 134 阅读 · 0 评论 -
461. 汉明距离
求不同的位数,很明显用异或。x和y直接异或,^的结果就是相同为0,不同为1,我们数1的个数即可。class Solution {public: int hammingDistance(int x, int y) { //^异或,不同为1;&与全1为1;|或全0为0 //x和y直接做异或,看有几位1就行 int a = x^y; int res = 0; while(a != 0){ .原创 2021-01-31 01:26:12 · 186 阅读 · 1 评论 -
位运算小技巧
基本原理0s 表示一串 0,1s 表示一串 1。x ^ 0s = x x & 0s = 0 x | 0s = xx ^ 1s = ~x x & 1s = x x | 1s = 1sx ^ x = 0 x & x = x x | x = x利用 x ^ 1s = ~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。1^1^2 = 2利用原创 2021-04-02 01:28:27 · 155 阅读 · 0 评论