位運算的自悟

2021-07-27 18:55:58 字數 2173 閱讀 7293

口訣:

清零取反要用與,某一位置可用或。

若要取反和交換,輕輕鬆鬆用異或。

1.先舉個例子,6的二進位制是:110 ,所以 在補0 後顯示為:0000 0011。

沒錯,如你所見,二進位制在 補0後 是以 後為前的排序

2.給定整數 n與m. 進行位運算操作:1 << m

這是個非常 常用的操作,常用於:對n的第m位數進行操作。

1 << m :可謂是,定位 到 n 的第m位數,然後 n的第m位數,在與 1 進行 位運算操作。

3.基本的位運算操作

先給定整數 n,整數 m(0,1,2,3...sizeof(int))

1). & :只有對應的兩個 二進位制數,均為1,結果才為 1,否則為 0

& 1 :判斷 n的第m位數。

介紹兩個重要應用,來證明其含義:

(n >>m ) & 1 :判斷 整數n 的二進位制 第m位 是否 為1 或者 為0

此時,"& 1" 的重要性 就體現出來了,n 的第m位數,如果為1 ,1&1 就返回1 ,如果為0,0&1 就返回0

所以說,可以利用 &1 來判斷 n的二進位制數的第m位數情況,為1 還是為0

並且,還有乙個特別重要的應用,n & 1,可以判斷 n 的奇偶性

畢竟 如果n 為奇數,輾轉相除2,最後的餘數 必定為1,如果n 為偶數,輾轉相除 餘數必定為 0

也就是說,n為奇數,n&1 等價於 1&1 ,返回值 為1,n為偶數,n&1 等價於 0&1,返回值為 0

& 0 :將 n的第m位數,重置為0

基本應用:n & ~(1 << m)

第一步:1 << m : 定位到 n的第m位數

第二步:~(1 << m):將1進行非運算,變為 0,其他剩下的m位,變成 1,而 &1,是無實際作用的

第三步:n & 0 :& 按位與運算:只有對應的兩個數 全部為1時,結果才為1,而&0,顯而易見,返回值一定為 0

2). | :只有對應的兩個 二進位制數,均為0,結果才為 0,否則為 1

| 1 :將 n的第m位數,重置為1

基本應用:n | (1 << m):

第一步:1 << m : 定位到 n 的第m位數

第二步:n | 1 :n的第m位數 進行 |1 操作 其返回值必定為 1!因為|只有,兩個數都為 0時,結果才為 0

| 0:一定要清楚, 是 n的第m位數 在進行操作,其他 位數操作,根本無 影響

因為,其他位數,是 在進行 "| 0" 操作,而所謂的 |0 操作,與 &1 操作,毫無差別,都是無實際作用的

假設 k=n的第m位數,k = 1 ,k|0 = 1|0 = 1,k = 0,k|0 = 0|0 = 0,所謂 無實際作用就是如此

但是要注意一點,我說的 0 是在二進位制數中的0,有實際含義的 0,不是補 0的0

所以,可以感性的認識到,| 0 與 & 1 以及 下文的 ^ 0,都是無實際作用的

3). ^ :只有對應的兩個 二進位制數相等時,結果才為 0,否則為 1

^ 1: 將 n的第m位數,取反

基本應用:n ^ (1 << m)

第一步:1 << m : 定位到 n的第m位數

第二步:n ^ 1,我們要知道,^ (異或):不相等為 1,相等為 0

而 ^1:如果 n的第m位數 為1,1^1 返回值為 0,如果 n的第m位數 為0,0^1 返回值 為1

所以,^1 的重要作用,就是 與之相反的作用

^ 0: 與 上文提到的 & 1 ,| 0 相似,都是無實際含義的操作

假定 整數k 為0,k^0 = 0^0 = 0 ; 假定整數k 為1,k^0 = 1^0 = 1

所以說,無論怎麼變化,^0 都是無實際作用的

總結:(n >> m) & 1 == (n >> m) | 0 == (n >> m) ^ 0

n & ~(1 << m) : 將 n的第m位數,重置為 0

n | (1 << m) : 將 n的第m位數,重置為 1

n ^ (1 << m) : 將 n的第m位數,取其相反

位運算 57 普通的位運算

要求說明 當 a 2,b 4,c 6,d 8時程式設計求a c b d a d a的值。解 單目運算子 都是對對應整數轉化成二進位制數後按位比較計算 兩個相應二進位中,都為1,該位為1,否則為0 兩個相應二進位中,有乙個1,該位為1,否則為0 兩個相應二進位,相同為0,不同為1 單目運算子,作用對二...

指標的自加自減運算( , )

陣列名代表陣列的首位址,是指標常量,不能進行自加自減運算。void main p a printf s t p 1 p是指向指標的指標,p指向a 0 one p 1指向第二個字母n printf s t p 1 p 1指向a 1 輸出two printf c t p one 的第乙個字母 o pri...

位運算(1) 初識位運算

前段時間數電課學了些進製轉換,還有與或非等邏輯運算,如今再來看看位運算,倒輕鬆了不少。很早就想寫些非總結性部落格了,奈何還是太懶。也也不知怎的突然又來了興致,趕忙寫下這篇部落格。廢話不多說,今天準備總結總結關於位運算的知識。程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的,即0 1兩種狀態,...