Visual Studio 2015的釋出,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視訊教程經驗(注:由於視訊修改難度大,所以先暫時釋出文件,視訊後期逐步補上),本文主要涉及:
① 按位取反位運算子:~
② 按位求與位運算子:&
③ 按位求或位運算子:
④ 按位異或位運算子:^
⑤ 按位右移位運算子:>>
⑥ 按位左移位運算子:<<
工具/原料
Visual Studio 2015
Windows 8.1 x64
簡述
位運算子跟我們前面介紹的邏輯運算子的運算邏輯是一致的,區別在於:
①
邏輯運算子是把整個運算元當做整體來判斷,非0就是0,即可以等價替換成1來進行操作;
位運算子是把資料的二進位制形式中每一位當做一個整體來進行處理;
②
邏輯運算子是巨集觀上的操作;
位運算子是微觀上的操作;
按位取反位運算子~ 對應於 邏輯運算子 !
按位求與位運算子& 對應於 邏輯運算子&&
按位求或位運算子 對應於 邏輯運算子
當然位運算子還多了三個運算子:
按位異或運算子 ^
按位右移位運算子:>>
按位左移位運算子:<<
~
① 通過快捷鍵F1開啟msdn;
② 輸入 One's Complemet Operator;
③ 在列表選項裡面選擇 One's Complement Operator;
於是便打開了msdn對於按位取反運算子的解釋;
注:在國外書籍或者msdn中把按位取反運算子稱為“一的反碼運算元”有時候也稱為“按位反碼”,
對運算元的每一位進行反碼操作,也就是說,對於每一位而言,如果這一位是1,那麼結果就是0,如果這一位是0,那麼結果就是1;
① 完成下圖的程式碼;
② 使用快捷鍵F5進入除錯模式;
③ 使用快捷鍵Ctrl+Alt+W,1,調出監視視窗;
④ 在監視視窗使用16進位制顯示;
由於16進位制的每一位對應到2進制中就是4位,所以對2進位制的每一位取反,相對於16進位制而言就是用16進位制的F(10進位制的15)減去當前位的值,所以
① 由於-1的16進位制是0xffffffff,所以對他的每一位取反就是:
等價於:0x(f-f)(f-f)(f-f)(f-f)(f-f)(f-f)(f-f)(f-f)
等價於:0x00000000
於是結果就是0
② 由於 12345的16進位制是 0x00003039:
等價於:0x(f-0)(f-0)(f-0)(f-0)(f-3)(f-0)(f-3)(f-9)
等價於:0xffffcfc6
下圖顯示了邏輯運算同算術運算的結果的差異
&
① 通過快捷鍵F1開啟msdn;
② 輸入 & Operator;
③ 在列表選項裡面選擇 bitwise Operator;
於是便打開了msdn對於按位求與運算子的解釋;
按位求與運算子,如果第一個運算元與第二個運算元對應位置上的bit值都是1,那麼對應位置的結果就是1,否則為假;
對於任何進位制而言,如果某一位是0,那麼與運算的結果就是0;對於16進位制而言,如果某一位是F,那麼運算結果就是另一個運算元對應的值;
下圖的例子同時演示邏輯運算子&&和按位運算子&的使用區別;
① 由於-24的16進位制是0xffffffe8,
34326的的16進位制是0x00008616,
由於0xffffffe8的前6位都是f,所以結果的前6位是0x00008616的前6位;
0xe8對應的二進位制是:1110 1000
0x16對應的二進位制是:0001 0110
進位制與操作結果是: 0000 0000
所以最終的結果是:0x0000 8600
② 由於-24不為0,為真,所以在邏輯學裡面可以用1代替;
同理 3436也可以用1來代替,於是
(-24 && 34326) 等價於 (1 && 1)
於是結果便是 1
① 通過快捷鍵F1開啟msdn;
② 輸入 Operator;
於是便打開了msdn對於按位求或運算子的解釋;
按位求或運算子,如果任一運算元的對應位為1,那麼結果的對應位為1,否則為0;
對於任何進位制而言,如果某一位是0,那麼與運算的結果就是另一個運算元對應位的值;對於16進位制而言,如果某一位是F,那麼運算結果就F;
下圖的例子同時演示邏輯運算子 和按位運算子 的使用區別;
① 123的16進位制是0x0000007b,
-14343的16進位制是0xffffc7f9;
由於0x0000007b的前6位是0,所以結果的前6為是0xffffc7;
後兩位 0x7b 的二進位制:0111 1011
後兩位 0xf9 的二進位制:1111 1001
按位或的結果是: 1111 1011即16進位制的0xfb
於是總的結果是:0xffffc7fb;
② 由於123不為0,為真,所以在邏輯學裡面可以用1代替;
同理 -14343也可以用1來代替,於是
(-23&& -14343) 等價於 (1 1)
於是結果便是 1
^
下圖是msdn對於按位異或的解釋
按位異或將比較兩個運算元中的每一位,如果一個運算元對應位是1,另一個運算元對應位是0,那麼結果是1,否做結果是假;
對於任何進位制而言,如果某一位是0,那麼異或運算的結果就是另一個運算元對應位的值;對於16進位制而言,如果某一位是F,那麼運算結果是另一運算元的反碼(取反);
如下圖由於:
123的16進位制是0x0000007b,
-14343的16進位制是0xffffc7f9;
由於0x0000007b的前6位是0,所以結果的前6為是0xffffc7;
後兩位 0x7b 的二進位制:0111 1011
後兩位 0xf9 的二進位制: 1111 1001
按位或的結果是: 1000 0010的16進位制的0x82
所以總的結果便是:0xffffc782
按位左移:左運算元的每一位向左移動右運算元位,高位捨棄,低位補0;
如下圖的例子:
① 123 的16進位制:0x0000007b
對應的二進位制:0000 0000 0000 0000 0000 0000 0111 1011
向左移動三位:0000 0000 0000 0000 0000 0011 1101 1000
換成16進位制後結果:0x00 00 03 d8
② ③ 同理
④ -2140847327的16進位制:0x80654321
對應的二進位制:1000 0000 0110 0101 0100 0011 0010 0001
向左移動2位: 0000 0001 1001 0101 0000 1100 1000 0100
換成16進位制後結果:0x01 95 0c 84