1. 程式人生 > 實用技巧 >20.11.13 LeetCode位運算

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