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...