位運算專題

2021-09-24 03:51:28 字數 4507 閱讀 3801

給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。

示例 1:

輸入: 1

輸出: true

解釋: 20 = 1

示例 2:

輸入: 16

輸出: true

解釋: 24 = 16

示例 3:

輸入: 218

輸出: false

/*

& |

^ 異或 相同為0 不同為1 相當於加法

0^0 0

1 0 1

0 1 1

1 1 0

~ 取反

>> 右移 1101 >> 1 = 110 最低位去掉 相當於除以2 下取整 1101 >> 2 = 11

<< 左移 1101 << 1 = 11010 最高位去掉 相當於乘以2 上取整 1101 << 3 = 1101000

x & -x

x > 0

5 = 101

x < 0

|x| = 101 x的補碼 ~x+1 101 的補碼 011

x = 11010101000

-x = 00101010111 + 1

00101011000

& 00000001000

x & -x 等於x的二進位制表示裡最右邊的乙個1

所以如果x 是二的整數冪的話 x的二進位制表示 就是 一堆0 + 1 + 一堆0 故 x & -x == x

如果不是 x & -x < x

*/ class solution };

class solution

};

給定兩個整數 l 和 r ,找到閉區間 [l, r] 範圍內,計算置位位數為質數的整數個數。

(注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。)

示例 1:

輸入: l = 6, r = 10

輸出: 4

解釋:6 -> 110 (2 個計算置位,2 是質數)

7 -> 111 (3 個計算置位,3 是質數)

9 -> 1001 (2 個計算置位,2 是質數)

10-> 1010 (2 個計算置位,2 是質數)

示例 2:

輸入: l = 10, r = 15

輸出: 5

解釋:10 -> 1010 (2 個計算置位, 2 是質數)

11 -> 1011 (3 個計算置位, 3 是質數)

12 -> 1100 (2 個計算置位, 2 是質數)

13 -> 1101 (3 個計算置位, 3 是質數)

14 -> 1110 (3 個計算置位, 3 是質數)

15 -> 1111 (4 個計算置位, 4 不是質數)

注意:1.l, r 是 l <= r 且在 [1, 10^6] 中的整數。

2.r - l 的最大值為 10000。

class solution );

int res =0;

for(

int i = l; i <= r; i++

)return res;}}

;

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]

輸出: 1

示例 2:

輸入: [4,1,2,1,2]

輸出: 4

class solution 

};

給定乙個正整數,輸出它的補數。補數是對該數的二進位制表示取反。

注意:1.給定的整數保證在32位帶符號整數的範圍內。

2.你可以假定二進位制數不包含前導零位。

示例 1:

輸入: 5

輸出: 2

解釋: 5的二進位制表示為101(沒有前導零位),其補數為010。所以你需要輸出2。

示例 2:

輸入: 1

輸出: 0

解釋: 1的二進位制表示為1(沒有前導零位),其補數為0。所以你需要輸出0。

class solution 

return res;}}

;

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,3,2]

輸出: 3

示例 2:

輸入: [0,1,0,1,0,1,99]

輸出: 99

/*

狀態機:

初始: 0 0

1個1 1 0

2個1 0 1

3個1 0 0

*/class solution

return ones;}}

;class solution

return ans;}}

;

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例 :

輸入: [1,2,1,3,2,5]

輸出: [3,5]

注意:1.結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。

2.你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

class solution 

return vector<

int>;}

};

不使用運算子 + 和 - ​​​​​​​,計算兩整數 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

輸入: a = 1, b = 2

輸出: 3

示例 2:

輸入: a = -2, b = 3

輸出: 1

class solution 

};

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

示例 1:

輸入: [5,7]

輸出: 4

示例 2:

輸入: [0,1]

輸出: 0

class solution 

return res;}}

;

兩個整數的 漢明距離 指的是這兩個數字的二進位制數對應位不同的數量。

計算乙個陣列中,任意兩個數之間漢明距離的總和。

示例:輸入: 4, 14, 2

輸出: 6

解釋: 在二進位制表示中,4表示為0100,14表示為1110,2表示為0010。(這樣表示是為了體現後四位之間關係)

所以答案為:

hammingdistance(4, 14) + hammingdistance(4, 2) + hammingdistance(14, 2) = 2 + 2 + 2 = 6.

注意:1.陣列中元素的範圍為從 0到 10^9。

2.陣列的長度不超過 10^4。

class solution 

return res;}}

;

給定乙個非空陣列,陣列中元素為 a0, a1, a2, … , an-1,其中 0 ≤ ai < 2^31 。

找到 ai 和aj 最大的異或 (xor) 運算結果,其中0 ≤ i, j < n 。

你能在o(n)的時間解決這個問題嗎?

示例:輸入: [3, 10, 5, 25, 2, 8]

輸出: 28

解釋: 最大的結果是 5 ^ 25 = 28.

class solution 

;

vector nodes;

intfindmaximumxor

(vector<

int>

& nums)))

;//初始化 左右兒子為0,0 根節點

for(

auto x : nums)))

;//初始化左右兒子為空

nodes[p]

.son[t]

= nodes.

size()

-1;}

p = nodes[p]

.son[t];}

}int res =0;

for(

auto x : nums)

else

p = nodes[p]

.son[t]

;//貢獻0

} res =

max(res, m_xor);}

return res;}}

;

位運算專題

1.寫乙個函式,返回二進位制中1的個數 define crt secure no warnings include include 寫乙個函式,返回引數二進位制中的1的個數 int count one bits unsigned int value return count int main 2.獲...

演算法專題 位運算

基本概念 按位與運算 取min 按位或運算 取max 按位異或運算 不進製加法 按位取反運算 按位左移運算 按位右移運算 運算子優先順序表 判斷奇偶a 1大小寫切換c 32求x二進位制中第k位數 x k 1特定位翻轉,01111010後四位翻轉,01111010 00001111交換兩個數a a b...

專題總結 位運算

首先我們需要熟悉python的位運算子 a 0011 1100 b 0000 1101 位運算常用的運算子包括 按位與 按位或 按位非 按位異或 有符號左移位 有符號右移位 x 1s x實現數的位級反轉。1s表示一串1 利用x x 0可以實現除重。保留唯一乙個不重複的數字。利用x mask可以實現掩...