基本概念
按位與運算 &(取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可以實現掩...