1. 程式人生 > >關於按位與和按位或以及左/右移的相關知識

關於按位與和按位或以及左/右移的相關知識

1、按位與(&)與普通的與(&&)的一些不同之處:

(1)按位與(&)是每個相應的位元位都進行與操作,在比較時依然遵循0&&1=0&&01&&0=0,1&&1=1原則。而與(&&)操作是整體進行比較時遵循0&非零=0,非零&非零=1原則。

(2)舉例:char a=10;char b=3;求a&&b,與a&b;

             解:二進位制的表示形式為:a:00001010

                                                        b:00000011

                   與操作的結果為:1(因為10和3都可以表示為真,所以與操作後的結果也是真即1)

                   按位與操作結果為:00000010==2; 

注:按位或與或操作也是相應的道理,讀者可以自行判斷。

2、移位操作:

  左移操作是把每個位元位向左移動一個單位而最高位則自動補充一個0,右移操作是每個位元位向右移動一位從而在最低位補充一個0;所以左移相當於除2,右移相當於乘2。

3、按位操作經常會與左移(<<)和右移(>>)操作結合到一起進行操作。

例如:實現一個對8bit資料的指定位的置0或置1操作,並保持其他位不變。

解:相應的程式程式碼如下:

正確程式碼是標有(1)的兩句程式碼,有的人會覺得(2)程式碼理解起來也對啊,為什麼是錯誤的呢?那你就犯了一個常識性的錯誤,如果你把*p_data進行移位處理的話,那麼你的原值會進行改變,那如果執行完(2)語句後再加上(3)語句把p_data移回來不行麼,這裡要清楚一點,就是你移位操作補上去的都是0,而不再是原來的數字了,比如1011先右移兩位變成0010再左移兩位變成1000而不再是原來的1011了,所以只能對1進行移位操作,因為1除了最後一位其餘的都是0所以可以隨意的移位。

若上述講述的有什麼不對的地方,或者有什麼可以改進的地方 歡迎在下方的評論區寫下您的意見,我會及時回覆並更正,謝謝。