1. 程式人生 > >C++中的位運算子

C++中的位運算子

 /**********筆者魯鈍,不善言辭,以下內容均是當初課程筆記整理,相對簡陋淺顯,適合於新手教程,大牛勿見笑,若能助君一程,在下不勝感激!******/


眾所周知我們的位運算子有&(按位與), |(按位或), ^(按位異或), ~(按位取反), >>(右移)和<<(左移)。

我們知道計算機中所有資料都是以二進位制的形式儲存的,而我們的位運算就是建立在這個的基礎上。

下面我將分別介紹這幾種位運算,其中重點介紹按位取反這種運算,筆者將根據自己的個人經驗並結合實際例子將之闡述解釋

1,&運算

&表示的意思,遵循的是全真即真,有假即假

的原則,這與我們離散數學中的合取有異曲同工之妙。

例:

4 & 5 ?

要計算這題首先需要將它們轉化為二進位制的形式

1) Change them into binary digit

4    &   5   <==>    100   &   101

接下來按位比較

2)Bitwise comprison

1與1&運算仍為1,0與0&運算仍為0,0與1&運算為0,即結果為100

將結果轉化為十進位制

3)Change them into decimal digit

100的十進位制形式為4,即4 & 5 == 4


2,| 運算

| 是 的意思,與數學中的 析取類似,運算規則為: 一真全真,同假為假。由於運算步驟與&運算雷同,在此不再贅述,只舉例子,請讀者自行理解。
4    |   5   <==>  100  |  101   <==>   101   <==>   5

3, ^運算

^是 異或
的意思,異或這種運算是實現 邏輯加法的基礎,其運算規則為: 兩同為假,相異為真。
限於文章格式問題筆者無法詳細為大家列舉出異或的詳細運算,其運算模式與邏輯加法相同,在此為大家特意整理出具體方法請移步https://jingyan.baidu.com/article/86112f135745432736978776.html。 同樣給大家舉個例子: 4  ^ 5  <==>  100  ^ 101  <==>  001  <==>  1

4,移位運算

<<和>>分別表示左移與右移,其實質是小數點的移動,同樣是建立在二進位制的基礎上,下面舉例:
<<左移運算 2  <<  3    //2的二進位制是10,為了方便我們人為新增一個小數點 10. 此時的1與小數點之間相差一位,當我們左移三位時,1與小數點之間的距離增加至4,此時結果為 10000. 然後將之轉為十進位制形式得出結果16。
>>右移運算 方法類似,下面只舉例: 64  >>  2  <==>  1000000.  <==> 10000.00   <==>   16
注意:
在C++中cout的情況如: cout << 3;    // 此時的<<表示插入運算子,運算子過載了
對於過載的概念,簡單來說就是同名函式或方法不同引數。 感興趣的讀者可移步百度,在次不再贅述。


5,~按位取反運算

此運算是筆者認為最頭疼的運算,當時看的時候糾結了很久,查了很多資料最終整理出了自己的一套方法,下面就個人經驗進行總結:


/**************************總結****************************/
 按位非運算的思想就是找到該數的補碼進行十進位制運算後取反得到
 對正數使用按位非運算:補碼+1後符號取反
 對負數使用按位非運算:補碼符號取反

/***********************注意*****************************/
 正數的原碼,反碼補碼都是相同的
 負數進行反碼和補碼轉換時符號位不動

例:

   ~7
  0 0000111 --> 0 0000111 --> 0 0000111 --> 1 0001000 --> -8
 
  ~-7
  1 0000111 --> 1 1111000 --> 1 1111001 --> 0 0000110 --> 6


本著求真務實的理念,我是十分希望能仔細羅列這部分,但擔心想當初的我一樣,看了太多腦子越亂,所以我用盡量簡潔的語言歸納了這部分,

如果對於想要深入瞭解計算機或者程式語言的大牛,這些遠遠不夠,筆者建議去找相關專業的書籍。