演算法專題 位運算

2021-09-29 11:15:23 字數 3953 閱讀 1686

基本概念

按位與運算 &(取min)

按位或運算 |(取max)

按位異或運算 ^(不進製加法)

按位取反運算 ~

按位左移運算 <<

按位右移運算 >>

運算子優先順序表

判斷奇偶a & 1大小寫切換c ^= 32求x二進位制中第k位數(x >> k) & 1特定位翻轉,01111010後四位翻轉,01111010 ^ 00001111交換兩個數a = a ^ b; b = b ^ a; a = a ^ b;去掉x二進位制中最後乙個1x & (x - 1)如:1101100->1101000

用途1:統計x二進位制中1的個數

用途2:用o(1)時間判斷n是不是2的冪次

只保留a二進位制的最後一位1a & -a如:a 11010,則a & - a 10(二進位制)

注:-n = ~(n-1)

用處:統計x二進位制中1的個數 例題

// 統計n的二進位制1的個數

intgetone

(int n)

x^1得到和你一組的另乙個數,0和1一組,2和3一組…

負數(-3)二進位制的快速求法:

-3 的二進位製碼為11111111 11111111 11111111 11111101

解:(-3 + 1) * (-1) = 2

2的二進位製碼為00000000 00000000 00000000 00000010

每位取反得到

-3 的二進位製碼為11111111 11111111 11111111 11111101

/**

* @author: wilson79

* @datetime: 2023年12月3日 下午01:18:39

* @filename: 201.數字範圍按位與.cpp

*//*

演算法:按位與&

假設n比m大 m到n個數一起作&運算

n: 1111110

m: 1110111

從高位開始看,只要第一次出現兩個數字數不一樣,則從這個位置開始後面一定都是0(因為一定會進製)

n: 111 1110

m: 111 0111

m和n之間一定會有111 1000,則這三個數作&運算就得到1110000

所以答案就是m和n從高位開始,連續相同的位數構成的數

*/class

solution

return m << k;}}

;

array = ;

只出現一次的數有兩個,其餘數均出現兩次

#include

using

namespace std;

intmain

(void);

int ans =0;

int cnt =0;

int result1 =

0, result2 =0;

int n =

sizeof

(array)

/sizeof

(array[0]

);for(

int i =

0; i < n; i++

)printf

("ans = %d\n"

,ans)

;//計算ans的最後一位1的位置

while

(ans)

cnt++

; ans >>=1;

}printf

("cnt = %d\n"

,cnt)

;//分組計算得到兩個出現一次的值

for(

int i =

0; i < n; i++

)else

}printf

("%d %d"

, result1, result2)

;return0;

}

array = ;

只有乙個數出現一次,其餘都出現三次

#include

using

namespace std;

int bits[32]

;//算出每個位出現1的個數,然後mod3

intsolve

(int array,

int n)

}for

(int j =

0; j <

32; j++)}

return result;

}int

main

(void);

int n =

sizeof

(array)

/sizeof

(array[0]

);int ans =

solve

(array, n)

;printf

("ans = %d"

, ans)

;return0;

}

問題:某個數出現一次,其他數出現兩次,找出這個數(要求o(n),o(1))

/*

方法:異或,乙個數異或同乙個數兩次,還是那個數

a^0=a,a^a =0

分析:o(n), o(1)(若用雜湊表,空間複雜度為o(n))

*/class

solution

return result;}}

;

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

記憶:取min

例:2 & 5 = 0

00000010

&00000101

得00000000

&(按位與)與&&(邏輯與)不同,&&有短路現象

1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0

記憶:取max

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

記憶:不進製加法

34 ^ 34 = 0 // 任何數異或自己等於0

x ^ 0 = x

(a ^ b) ^ c == a ^ (b ^ c)

單目運算

~24 = -25

~0 = -1

記憶:(當前數 + 1) * (-1)

說明:現在可以明白int範圍正反最大值絕對值為什麼差1了

另外~(按位取反)與!(邏輯非)不同

格式:x << n

功能:將二進位制位按位依次左移n位

2 << 1 = 2 * 2

12 ^1

21= 4

記憶:x * 2

n2^n

2n格式:x >> n

功能:將二進位制位按位依次右移n位

8 >> 3 = 8 / 2

32 ^ 3

23= 1

-8 >> 3 = -1

-17 >> 4 = -2

記憶:x / 2

n2^n

2n或x / 2

n2^n

2n+(-1)(x是負數且不能被2

n2^n

2n整除)

位運算專題

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

位運算專題

給定乙個整數,編寫乙個函式來判斷它是否是 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 取反 右...

專題總結 位運算

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