位運算 小白完全看的懂得超全位運算教程及其應用

2021-10-20 15:43:40 字數 4071 閱讀 9045

3.按位或"|"

4.按位異或"^"

5.按位非"~"

6.左移運算子"<<"

7.右移運算子">>"

8.檢驗學習成果

位運算:用於對整數型別(int , char , long 等) 變數中的某一位(bit), 或者若干位進行操作.

「&」按位與(雙目)

「|」按位或(雙目)

「^」按位異或(雙目)

「~」按位非(取反)(單目)

「<<」

左移(雙目)

「>>」

右移(雙目)

概念:皆一則一,否則為零(二進位制位)

將參與運算的兩個運算元對應的二進位制進行操作,只有對應的兩個二進位制位均為1時,結果的對應二進位制才為1,否則為0.

用法1:

按位與通常用來將某變數中的某些位 置0且保留其他位不變.

例: 將 int型變數n的低8位全置成0,而其餘位不變,則可以執行:

n = n &

0xffffff00

;// 或

n &=

0xffffff00

;

將 0xffffff00 轉成2進製表示 : 1111 1111 1111 1111 1111 1111 0000 0000

低8位都是0 ,其餘都是1. 因為0』與』任何數都是0, 1』與』0則0,1』與』1則1;

因此可以通過』&』 給任意位置 置為零

如果n為short型別,則需執行:

n &

=0xff00

;

用法2:

判斷int型別變數n的某一位是否是1(從又向左,從0開始數)

例如: 通過以下**則可以判斷第7位是否為1

n &

0x80

;// 若果表示式的值等於0x80, 則第7位為1

將0x80 轉成2進製表示: 1000 0000

可以看到除了第7位是1,其餘位都為0

同理可知, n第7位如果是1表示式結果第7位便是1,如果n第7位如果是0表示式結果第7位便是0.

概念:皆零則零,否則為一(二進位制位)

將參與運算的兩運算元各對應的二進位制位進行或操作,只有對應的兩個二進位都為0時,結果的對應二進位制位才是0,否則為1。

計算表示式: 21|18的值 :

21: 0000 0000 0000 0000 0000 0000 0001 0101

18: 0000 0000 0000 0000 0000 0000 0001 0010

21|18: 0000 0000 0000 0000 0000 0000 0001 0111 (23)

21:0000 0000 0000 0000 0000 0000 0001 0101

18:0000 0000 0000 0000 0000 0000 0001 0010

21|18:

0000 0000 0000 0000 0000 0000 0001 0111 (23)

用法1:

按位或通常用來將某變數中的某些位 置1且保留其他位不變.

例: 將int型別變數n的低八位全部置成1,而且其餘位不變,可執行:

n |

=0xff

;

將0xff 轉成2進製表示: 1111 1111

1 無論 「|」 0 還是 「|」 1, 結果都為1

概念:不同則1,相同則0(二進位制位)

將參與運算的兩個運算元各對應的進製位進行異或操作, 即只有對應的兩個二進位制位不同時,結果的對應二進位制位才是1, 否則為0 .

21:0000 0000 0000 0000 0000 0000 0001 0101

18:0000 0000 0000 0000 0000 0000 0001 0010

21^18:

0000 0000 0000 0000 0000 0000 0000 0111 (23)

用法1:

按位異或運算常用來將某變數中的某些位取反, 且保留其他位不變.

例: 將int型別變數n的低8位取反, 而其餘位不變,則可以執行:

n ^

=0xff

;

將0xff 轉成2進製表示: 1111 1111

如果n當前位為 1 , 因為1和1相同 , 則1^1=0

如果n當前位為 0 , 因為1和0不同 , 則1^0=1

便達到了取反的目的

性質:如果 a^b=c, 那麼就有 c^b = a 以及c^a = b. (窮舉法可證)

通過此規律可以用於簡單的加密解密.

原文a 通過秘鑰b加密成密文c , 密文c通過秘鑰b 解密成原文a.

通過這個性質我們也可以用於整形變數之間的資料交換

用法2:

整形變數之間的資料交換;

例: (自己試著思考原因,然後繼續**下面文字內容)

int a =

5, b =7;

a = a ^ b;

b = a ^ b;

a = a ^ b;

即實現了a,b值的交換. 窮舉法可證

理解實現原理:

int a =

5, b =7;

//現在假設乙個變數c,使得a^b=c;

a = a ^ b;

//此時把c的值賦值給了a,那麼a == c;

b = a ^ b;

//因為a的值已經是最初c的值,a^b其實就等價於最初c的值^b,也就變回了a,並賦值給了b.

a = a ^ b;

//此時a裡面是最初的c,b裡面是最初的a,那麼a^b等價於最初的c^最初的a,也就是最初的b.並賦值 給變數a;

概念:

為0變1,為1變0(二進位制位)

按位非運算子"~"是單目運算子. 其功能是將運算元中的二進位制位0變1,1變0;

21:0000 0000 0000 0000 0000 0000 0001 0101

~21:

1111 1111 1111 1111 1111 1111 1110 1010

用法:用法就是取反…(全部取反,單個位取反用按位或)

概念:表示式: a << b 的值是:

將a各二進位制位全部左移b位後得到的值.左移時,高位丟棄, 低位補0. a 的值不因運算而改變(如要改變a = a《例: 9 << 4

將 9 和 4 轉成二進位制形式:(這裡為了突出不用**了)

9 : 0000 0000 0000 0000 0000 0000 00001001

9 << 4 : 0000 0000 0000 0000 0000 000010010000

即為十進位制的144.

規律+用法1:

左移1位, 就等於乘以2, 左移n位, 就等於乘以 2的n次方 .

左移的操作比乘法運算速度快很多(如果是2的次冪運算可以通過位運算來實現)

概念:表示式: a >> b的值是:

將a各二進位制位全部右移b位後得到的值.右移時,移出最右邊的位就被丟棄. a 的值不因運算而改變

對於有負號的數,如long, int, short, char 型別的變數, 在右移時, 符號位(及最高位) 將一起移動, 並且大多數c/c++編譯器規定, 如果原符號位為1, 則右移最高位就補充1 ,原符號位為0, 則右移時高位就補充0.

規律+用法1:

右移n位, 就相當於左運算元除以2的n次方, 並且將結果往小裡取整.

25 >> 4 = -2

等價於-25/16並向小取整, 由於是負數所以結果為-2

-2 >> 4 = -1

等價於-2/16並向小取整,由於是負數所以結果為-1

18 >> 4= 1

等價於18/16並向小取整,正數,結果為1

#include

intmain()

巧妙的位運算及模運算

原帖 輸入2的n次方 如果突然要你輸入2的19次方,你是不是還要想一下呢?敲個524288多累啊。用位運算 1 19又快又準。乘除2的倍數 千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 4,用25 2就好啦。判斷偶數 a 2取模是最常用的判斷方法之...

位運算及常用的功能

注 在涉及到位運算時,一定要注意位運算的優先順序。該加的括號一定要加 在計算機中,cpu只能接受二進位制的資料和指令 接下來就學習一下二進位制的運算 位運算 二進位制的運算有 按位與 按位或 按位異或 按位取反 左移 右移 a b a b a b a b 0 0 0 0 0 0 1 0 1 1 1 ...

位運算的應用場景及作用

位運算加速技巧 本方法可以讓c c 語言指令進一步接近彙編指令的執行效率,提高嵌入式系統的速度和穩定性。x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x int 1.232 改為 x 1.2...