位運算應用

2021-09-24 01:21:23 字數 2558 閱讀 4885

眾所周知,位運算是我們學計算機必學的東西,前人用二進位制、位運算給我們了乙個操作簡單的計算機,但我們卻很少接觸位運算了。今天介紹一些位運算在演算法中的運用。

位運算基礎

&按位與

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

|按位或

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

^按位異或

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

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

<<

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

>>

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

奇技淫巧

1.技巧一:用於消去x的最後一位的1

x & (x-1)

x = 1100

x-1 = 1011

x & (x-1) = 1000

1.1.應用一 用o(1)時間檢測整數n是否是2的冪次.

思路解析:n如果是2的冪次,則n滿足兩個條件。

1.n>0

2.n的二進位制表示中只有乙個1

一位n的二進位制表示中只有乙個1,所以使用n&(n-1)將唯一的乙個1消去。

如果n是2的冪次,那麼n&(n-1)得到結果為0,即可判斷。

1.2.應用二 計算在乙個 32 位的整數的二進位制表示中有多少個 1.

思路解析:

由 x & (x-1) 消去x最後一位知。迴圈使用x & (x-1)消去最後一位1,計算總共消去了多少次即可。

1.3.將整數a轉換為b,需要改變多少個bit位

思路解析

這個應用是上面乙個應用的拓展。

思考將整數a轉換為b,如果a和b在第i(0<=i<32)個位上相等,則不需要改變這個bit位,如果在第i位上不相等,則需要改變這個bit位。所以問題轉化為了a和b有多少個bit位不相同。聯想到位運算有乙個異或操作,相同為0,相異為1,所以問題轉變成了計算a異或b之後這個數中1的個數。

2.技巧二 使用二進位制進行子集列舉

應用.給定乙個含不同整數的集合,返回其所有的子集

樣例如果 s = [1,2,3],有如下的解:

[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2] ]

思路思路就是使用乙個正整數二進位制表示的第i位是1還是0,代表集合的第i個數取或者不取。所以從0到2n-1總共2n個整數,正好對應集合的2^n個子集。

s =

n bit combination

0 000 {}

1 001

2 010

3 011

4 100

5 101

6 110

7 111

解題**

之後補充。

技巧三.a^b^b=a

3.1.應用一 陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的。

問題given [1,2,2,1,3,4,3], return 4

解題思路

因為只有乙個數恰好出現乙個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。

c語言解題**

#include

int main()

;int ans=0;

for(int i=0;i<7;i++)

printf("%d\n",ans);

}3.2.應用二 陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的。

問題given [1,1,2,3,3,3,2,2,4,1] return 4

解題思路

因為數是出現三次的,也就是說,對於每乙個二進位制位,如果只出現一次的數在該二進位制位為1,那麼這個二進位制位在全部數字**現次數無法被3整除。

模3運算只有三種狀態:00,01,10,因此我們可以使用兩個位來表示當前位%3,對於每一位,我們讓two,one表示當前位的狀態,b表示輸入數字的對應位,two+和one+表示輸出狀態。

0 0 0 0 0

0 0 1 0 1

0 1 0 0 1

0 1 1 1 0

1 0 0 1 0

1 0 1 0 0

one+ = (one ^ b) & (~two)

two+ = (~one+) & (two ^ b)

c語言解題**

#include

void findnum(int *a,int n)

;for(int i=0;i>j)&1);}}

for(int i=0;i<32;i++)

for(int i=0;i>pos)&1)

}y=x^ans;

if(x>y) swap(x,y);//從大到小輸出x,y

printf("%d %d\n",x,y);

}int main()

;findnum(a,8);

}另外一種寫法

#include

void findnum(int *a,int n)

int main()

;findnum(a,8);

}**

位運算應用

位運算 針對整型 字元型,計算機會將它轉換為二進位制運算 1 按位與 x y 對應位都為1時才為1 用途 取 保留1個數的某位 對應掩碼的對應位為1 其餘各位置1 2 按位或 x y 對應位都為0才為0,否則為1 用途 將1個數的某些位置1,其餘不變 3 按位異或 x y 對應位相同為0,不同為1 ...

位運算應用

1.判斷乙個數的奇偶性。x 1 101 1 1 2.判斷x是否是2的正整數冪。x x 1 100 011 0 3.取出乙個數的某些二進位制位。3.1.x 1 d 1 10101 1 3 1 00100 取第d位 3.2.x 1 d 1 10101 1 3 1 00101 取最後d位,x對2 d取模 ...

位運算應用

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...