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; } };