20.11.13 LeetCode位运算

一般用法:

And&:一个数and 1取二进制的末位,可用来判断整数的奇偶

Xor^:两数交换:a=a xor b;b = a xor b; a = a xor b; a^a = 0; a^0 = a;

左移<<:在末尾添0,代表该数*2 效率更高,尽量用左移1位代替*2

右移>>:该数除以2,效率更高,尽量用右移1位代替/2

 

136.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

题解:可以利用按位异或a^a=0,a^0=a的性质,将数组内所有元素依次进行^操作,由于只存在1个数不重复,则^到最后留下的肯定就是该元素。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(const int& num:nums)
        {
            ans ^=num;
        }
        return ans;
    }
};

 

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

示例 1:

输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:

输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:本题直接利用&操作每次获取输入的最后一位加到输出数里,结合算术左移和右移即可。

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for(int i = 0;i<32;++i)
        {
            ans<<=1;
            ans += n&1;
            n>>=1;
        }
        return ans;
    }
};

 

posted @ 2020-11-13 11:12  γGama  阅读(72)  评论(0编辑  收藏  举报