C 和 C++ 編程中的按位運算符

已發表: 2022-12-09

在 RAM 中,數據被組織為字節序列。 每個字節包含八個連續的位。 當您想對數據的位執​​行一些算術運算時, C 和C++ 按位運算符很有用。 它們速度相當快,偶爾用於提高程序的效率。 他們致力於在位級執行操作或以各種方式操作位的位算法。

C&C++中位運算符的類型:

  1. 按位與
  2. 按位或
  3. 按位非
  4. 按位異或 (XOR)
  5. 左移運算符
  6. 右移運算符

讓我們詳細了解它們中的每一個:

目錄

1. 按位與:

C 或 C++ 中的按位與運算符使用單個與號 (&)。 它以兩個數字作為操作數並對它們的所有位執行 AND。 僅當兩個位都為 1 時,結果才為 1。如果任何位為 0,則結果為 0。本質上, C和 C++中的這個二元運算符對給定兩個數字的每個位置的位進行邏輯與運算二進制形式。

例子:

假設兩個數字 a 和 b 的二進製表示是:

一 = 01011000

b = 10111001

所以,a & b = 00011000

從上面的例子可以看出,結果只在數字 a 和 b 都為 1 的地方顯示“1”。對於所有其他地方,結果顯示“0”。

2.按位或:

在 C 和 C++ 中,按位或與按位與非常相似。 唯一的區別是,在按位或運算符中,要使結果中位的位置為“1”,兩個位中只有一個應該為“1”。 該運算符將兩個數字作為操作數,並對兩個數字的每一位執行或運算。

它以下列方式工作:

  • 如果兩位都為“1”,則結果為“1”。
  • 如果兩個位都為“0”,則結果為“0”。
  • 如果任何位為“1”,則結果為“1”。

它是最簡單和最常用的 C++ 按位運算符之一 它的符號是管道|。 此外,它與布爾邏輯運算符 || 相同。

例子:

假設兩個數字 a| 的二進製表示b 是:

一 = 01101001

b = 10111000

所以,一個| b = 11111001

3.按位非:

也稱為按位非運算符,它翻轉結果中的每一位。 它的符號是波浪號 (~)。 記住此運算符的工作方式的一種簡單方法是波浪號有時被稱為 twiddle,按位補碼旋轉每一位。 這意味著如果你有一個 1,結果就是 0,反之亦然。 換句話說, C和 C++中的這個按位運算符接受一個數字並反轉所有位。

在確定任何無符號數的最大可能值時,這是最有用的C++ 按位運算符之一

例子:

無符號整數 = ~0;

這裡,0 表示全 0:00000000。因此,實現位非運算符的結果為 1:11111111。因為 num 是一個無符號整數,所以您無需關心符號位或二進制補碼。 1s 是結果中可能的最大數字。

按位非運算符的關鍵特徵之一是 2 的補碼。 一個數的 2 的補碼等於該數的補碼加 1。

例子:

一 = 00000000

所以,它的 2 的補碼 = -(11111111+1) = -00000000 = -0(decimal)

注意:任意數 N 的按位補碼等於 -(N+1)。

從世界一流大學在線學習軟件開發課程。 獲得執行 PG 課程、高級證書課程或碩士課程,以快速推進您的職業生涯。

4. 按位異或 (XOR):

異或運算接受兩個輸入,如果其中一個或另一個輸入為 1,則輸出 1。但如果兩者均為 1,則結果為 0。如果兩個輸入均為 0 或均為 1,則結果為 0。結果僅當兩個位不同時,XOR 的 XOR 才為 1。二元運算符在 C和 C++ 中的符號是插入符號 (^)。 而且,這種按位運算符在C &C++簡稱為XOR。 它對每一對位執行異或運算。 必須注意,沒有與此運算符對應的布爾運算符。

例子:

假設我們有兩個數字

一 = 10101010

b = 01110010

現在 a ^ b = 10101010 ^ 01110010 = 11011000

您可以通過以下方式理解異或。 假設你有一些位,要么是 0 要么是 1,你稱之為 A。現在當你對 A 進行異或 0 時,你將得到 A。 所以,如果 A 為 1,則得到 1,反之亦然。 當您對 A XOR 1 進行異或運算時,這意味著您翻轉了 A。因此,如果 A 為 1,則得到 0,反之亦然。

如果你執行兩次按位異或運算,即你有兩個位,A和B,你設置C = A XOR B,然後執行C XOR B。那麼你得到的結果是A XOR B XOR C。它要么翻轉 A 的每一位兩次,要么不翻轉任何位。 因此,您只需按原樣取回 A。

您可以將二進制 XOR 運算視為一種選擇性旋轉。 如果對兩個數進行異或,其中一個全為1,結果就相當於一個小遊戲。

5. 左移運算符:

此按位運算符將所有位向左移動一定數量的指定位。 左移運算符已經清空的位用0填充,其符號為<<。

在 C 或 C++ 中,它的工作原理是首先取兩個數字,將第一個操作數的位左移,第二個操作數指示要將數字移動多少位。

句法:

<<= 5

下面是實現左移運算符的示例 C/C++ 程序:

主函數()

{

整數 = 5;

<<= 2;

count << “x :” << x << endl;

}

輸出:a = 20

軟件工程熱門課程和文章

熱門節目
軟件開發執行 PG 課程 - IIIT B 區塊鏈證書課程 - PURDUE 網絡安全證書計劃 - 普杜 計算機科學碩士 - IIIT B
其他熱門文章
2021-22 年美國雲工程師薪資 AWS 解決方案架構師在美國的薪水 美國的後端開發人員薪水 美國的前端開發人員薪水
Web開發人員在美國的薪水 2022 年 Scrum Master 面試問題 如何在 2022 年開始網絡安全職業? 工程專業學生在美國的職業選擇

6.右移運算符:

此按位運算符將所有位向右移動一定數量的指定位。 它的符號是>>。 在 C 或 C++ 中,此運算符首先取兩個數字,右移第一個操作數的位,第二個操作數指定數字的移位量。

句法:

一個 >>= 5

實現右移運算符的示例 C/C++ 程序:

詮釋主要(){

整數 = 5;

一個 >> = 2;

count << “x :” << x << endl;

}

輸出:a = 1

軟件工程熱門課程和文章

熱門節目
軟件開發執行 PG 課程 - IIIT B 區塊鏈證書課程 - PURDUE 網絡安全證書計劃 - 普杜 計算機科學碩士 - IIIT B
其他熱門文章
2021-22 年美國雲工程師薪資 AWS 解決方案架構師在美國的薪水 美國的後端開發人員薪水 美國的前端開發人員薪水
Web開發人員在美國的薪水 2022 年 Scrum Master 面試問題 如何在 2022 年開始網絡安全職業? 工程專業學生在美國的職業選擇

什麼時候應該在 C 和 C++ 中使用按位運算符?

  • 節省空間:

按位運算符有助於節省空間。 在單個位級別工作時遇到的一個常見問題是,如果您想要更多空間或節省時間,您可能必須重新設計程序的大部分。 但是在C&C++中使用位運算符可以消除依賴; 例如,您可以使用 ~0 來獲得可能的最大整數。 乘以二的位移位是一個典型的操作。 因此,它不會影響可讀性,這與位操作的高級使用在某些情況下會產生影響不同。

  • 加密:

如果您正在處理某種類型的加密或需要使用位字段來存儲布爾屬性的系統。

關於按位運算符的獨特事實

  • 如果不涉及進位,兩個數字的按位或只是這些數字的總和。 否則,您只需添加它們的按位與。 例如,假設 x = 5(101) 和 y = 2(010)。 因為不涉及進位,所以總和就是 x|y。 但是,如果我們現在將“x”更改為 6 (110),則總和將更改為 x|y + x&y,因為現在涉及到進位。
  • 從技術面試的角度來看,按位 XOR 運算符是最有價值的。 此處討論了與此相關的面試問題之一的示例。 “對於給定的一組數字,其中包含除了一個數字之外出現偶數次的所有元素,找出奇數出現的數字。” 您需要對所有數字進行異或才能解決此問題。
  • 右移和左移按位運算符不得用於負數。 確定移位次數的第二個操作數包含一個負數,這會導致 C 和 C++ 中出現未定義的行為。 例如,1 >>- 1 和 1 << -1 的結果都是未定義的。
  • 如果數字的移位超出整數的容量,則行為未指定。 例如,如果整數以 64 位格式存儲,則 1 << 65 未指定。
  • 如果第二個操作數(決定移位數的那個)為 0,則不會發生移位操作。

使用 UpGrad 開始您的計算機科學之旅:

如果您打算詳細了解前端開發(JavaScript、HTML、CSS)、後端(NoSQL-MongoDB)和微服務,那麼您可以攻讀 UpGrad 的計算機科學理學碩士課程。 本課程由 IIT Bangalore 和 LJMU Alumni Status 提供,可幫助您在世界各地的科技巨頭中成為一名軟件工程師/全棧開發人員。

該課程包括為初學者和非技術編碼人員免費訪問職業轉型訓練營。 您將在本課程中學習十多種編程語言和工具,為您接管行業中的複雜角色做好充分準備。

C++中的位運算符有什麼用?

在 C++ 中,按位運算符在二進制級別對整數數據執行運算。 它們對涉及單個位操作的位模式進行操作。 因此,按位運算也稱為位級編程。 C++ 中的按位運算符主要用於更快的計算,因為它們僅對兩位數字(即 0 和 1)起作用。這些運算符還可以進行測試和移動實際位。

您可以在代碼中同時使用左右移位運算符嗎?

是的,您可以組合左移和右移運算符,然後,您可以從整數表達式中提取數據。

互補運算符是否翻轉了整個代碼序列?

不,它沒有。 它翻轉 1 和 0。 所以,所有的 1 都變成 0,反之亦然。

為什麼Bitwise complement operator的另一個名字是one's complement operator?

原因是它總是只接受一個操作數或值。 它是一個一元運算符。 當您對任何位執行補碼時,所有的 0 都變成 1,反之亦然。 例如,如果您有一個值為 1111 0000 的整數表達式。執行按位補碼運算後,該值變為 0000 1111。