位運算的神奇用法

2021-09-23 23:56:14 字數 2843 閱讀 6111

&

按位與如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0

|

按位或兩個相應的二進位制位中只要有乙個為1,該位的結果值為1

^

按位異或

若參加運算的兩個二進位制位值相同則為0,否則為1

~

取反~是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1

<<

左移用來將乙個數的各二進位制位全部左移n位,右補0

>>

右移將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數, 高位補0

#includeusing namespace std;

int main(){

int a=8,b=9; //a=0100 b=0101

a=a^b; //a=0001 b=0101

coutint main(){

int a=6;

a=a&-a;

coutint main(){

int a=6;

a=a&(a-1);

couta-1= 0101

a&(a-1)=0100

#include#includeusing namespace std;

int main(){

int len=4;

for(int i=0;i<1<=0;j--){

i&(1《引自

bitset用來儲存二進位制數字。像乙個bool型別的陣列一樣,bitset每個元素只有0或1兩個數值。

但是有空間優化——bitset中的乙個元素一般只佔1 bit。

bitset中的每個元素都能單獨被訪問,例如下面的**:

輸出格式

printf("%d\n",x.to_ulong());

couta,b(string(「101」)); //定義bitset,15是指有15位

a[10]=1; //將第10位定義為1

輸出a;

輸出b;

a=101; //賦值a

輸出a;

輸出:1024

000010000000000

5000000000000101

101000000001100101

可以看出,a[10]=1相當於+2^10。

而下面直接輸出bitset就很玄妙。

另外,字串可以直接轉到bitset中。

有意思的是,bitset可以直接賦值!

當然也可以bitset<15>c(101)來賦值!

then

bitset<4> a ( string("1001"));

bitset<4> b ( string("0011"));

cout << (a^=b) << endl; // 1010

cout << (a&=b) << endl; // 0010

cout << (a|=b) << endl; // 0011

cout << endl << a << endl; // 0011

cout << b << endl << endl; // 0011

cout << (a<<=2) << endl; // 1100

cout << (a>>=1) << endl; // 0110

cout << endl << a << endl; // 0110

cout << b << endl << endl; // 0011

cout << (~b) << endl; // 1100

cout << (b<<1) << endl; // 0110

cout << (b>>1) << endl; // 0001

cout << (a==b) << endl; // false (0110==0011)

cout << (a!=b) << endl; // true (0110!=0011)

cout << (a&b) << endl; // 0010

cout << (a|b) << endl; // 0111

cout << (a^b) << endl; // 0101

看完這些,估計您已經對bitset有個深刻的了解,它資瓷位運算!

then

對於乙個叫做a的bitset:

a.size()      返回大小(位數)

a.count() 返回1的個數

a.any() 返回是否有1

a.none() 返回是否沒有1

a.set() 全都變成1

a.set(p) 將第p+1位變成1

a.set(p, x) 將第p+1位變成x

a.reset() 全都變成0

a.reset(p) 將第p+1位變成0

a.flip() 全都取反

a.flip(p) 將第p+1位取反

a.to_ulong() 返回它轉換為unsigned long的結果,如果超出範圍則報錯

a.to_ullong() 返回它轉換為unsigned long long的結果,如果超出範圍則報錯

a.to_string() 返回它轉換為string的結果

神奇的位運算 bitwise trick

在計算機中,資料都以二進位制補碼的形式儲存,根據這一特點,適當採用位運算 bitwise operation 可以很巧妙地解決問題,同時運算效率更高。時刻牢記,最大的負數是 1,在計算機中,它的儲存形式是全1。左移相當於乘以2,友誼相當於除以2.在計算機中,位運算比乘法 除法運算要快得多,所以適當採...

神奇的按位運算 python

先來看leetcode 29上的divide two integers題目要求 divide two integers without using multiplication,division and mod operator.if it is overflow,return max int.就是...

攔截飛彈 加了神奇的位運算

傳送門 洛谷 p1020 飛彈攔截 思路 第一問為求一段序列 的最長不下降子串行的長度 第二問求得是 不下降子串行的個數 對於第一問,跑一邊 最長不下降子串行即可 對於第二問,依舊是跑一邊第一問即可 霧 其實還要加一點神奇的位運算。include include include define max...