C語言視頻 VS2015:[20]位運算符

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

通過一次左移運算,將 -2140847327 轉成了正的 26545284

>>

右移運算相對於左移運算要複雜一下,右移運算分為兩種:

① 無符號數的 邏輯右移運算;

② 有符號數的 算術右移運算;

無符號數的 邏輯右移運算 同左移運算一樣,左操作數的每一位向右移動右操作數位,低位捨棄,高位補0;

如下圖所示,由於

① 123 的16進位:0x0000007b

對應的二進位:0000 0000 0000 0000 0000 0000 0111 1011

向左移動3位: 0000 0000 0000 0000 0000 0000 0000 1111

對應的16進位:0x00 00 00 0f

②的同理不再演示;

有符號數的稱為算術右移,在進行移位的時候需要考慮符號位,左操作數的每一位向右移動右操作數位,低位捨棄,高位補符號位(即二進位位的最高位)

註:正數的最高位是0,負數的最高位是1

① 123 的16進位:0x0000007b

對應的二進位:0000 0000 0000 0000 0000 0000 0111 1011

其對應的最高位是 0,

向左移動3位: 0000 0000 0000 0000 0000 0000 0000 1111

對應的16進位:0x00 00 00 0f

② -14343的16進位:0xffffc7f9

對應的二進位:1111 1111 1111 1111 1100 0111 1111 1001

其對應的最高位是:1

想左移動4位後:1111 1111 1111 1111 1111 1100 0111 1111

對應的16進位是:0xff ff fc 7f

方便他人亦是方便自己,如果覺得還行就點下下邊投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!

原作者:付科

相關文章

  1. C語言視頻 VS2015:[23]運算符優先級

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  2. C語言視頻 VS2015:[14]關係運算符

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  3. C語言視頻 VS2015:[12]算術運算符

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  4. C語言視頻 VS2015:[22]自增自減運算符

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  5. C語言視頻 VS2015:轉義字符

    如何正確的使用轉義字符,本經驗主要涉及: ① 轉義字符代碼實踐: ② 如何在路徑里使用轉義字符: ③putchar輸入字符 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visu ...
  6. C語言視頻 VS2015:變量聲明的意義

    本經驗主要涉及: 變量聲明的重要性: 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Studio 2015 Preview 新建項目 新建項目: 或者使用快捷鍵:C ...
  7. C語言視頻 VS2015(1):helloworld

    如何用Visual Studio 2015寫一個簡單的hello world 程序,本經驗主要涉及: 如何通過Visual Studio 2015新建一個C程序: 本人自己看尹,cheng的視頻整理的 ...
  8. C語言視頻 VS2015:[10]printf

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  9. C語言視頻 VS2015:[16]邏輯運算符

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  10. C語言視頻 VS2015:內存單位與位數

    如何用Visual Studio 2015測試內存單位與位數,本經驗主要涉及: ①觀測內存: ②內存單位與位數 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Stu ...
  11. C語言視頻 VS2015:[5]HelloWorld詳解

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言的系列經驗. 很多書籍的第一個C語言的例子都是HelloWorld, ...
  12. C語言視頻 VS2015:[8]常量

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  13. C語言視頻 VS2015:數據類型轉換內存原理

    本經驗主要涉及: ①低字節的數據往高字節數據轉換,符號按照符號來填充: ②低字節轉高字節,高字節轉低字節 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Studio ...
  14. C語言視頻 VS2015:[13]類型轉換

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  15. C語言視頻 VS2015:[4]常用快捷鍵

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言的系列經驗. 軟體開發的過程中,代碼的質量很關鍵,但是代碼的編寫效率 ...
  16. C語言視頻 VS2015:進位轉換

    本經驗主要涉及: 如何轉換二進位.八進位.十進位,十六進位 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Studio 2015 Preview 新建項目 新建項目 ...
  17. C語言視頻 VS2015:[3]IDE界面介紹

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言的系列經驗,本經驗主要涉及: ① Visual Studio 201 ...
  18. C語言視頻 VS2015:[11]scanf

    Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(注:由於視頻修改難度大,所以先暫時發布文檔, ...
  19. C語言視頻 VS2015:數據類型轉換

    本經驗主要涉及: ① 隱式轉換: ② 強制轉換: 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Studio 2015 Preview 新建項目 新建項目: 或者使 ...
  20. C語言視頻 VS2015:常量分析

    如何用Visual Studio 2015測試常量,本經驗主要涉及: ①如何創建一個常量: ②真是意義上的常量 本人自己看尹,cheng的視頻整理的,希望對大家有幫助 工具/原料 Visual Stu ...