首頁 >後端開發 >C++ >C++中的位元運算及其應用技巧

C++中的位元運算及其應用技巧

WBOY
WBOY原創
2023-08-22 12:39:171739瀏覽

C++中的位元運算及其應用技巧

C 中的位元運算是程式設計師常用的運算方法,透過使用位元運算來處理資料能夠更有效率地完成一些複雜的計算任務。本文介紹了C 中常用的位元運算符號及其應用技巧,以及在實際開發中可能會用到的一些實例。

  1. 位元運算符號

C 中提供了六個位元運算符號,這些符號能夠對二進位位元進行操作,其中四個是位元運算符,另外兩個是移位運算符。位元運算符號如下:

& 位元與運算 :兩個二進位位元都為1時結果為1,否則為0。

| 位元或運算 :兩個二進位位元都為0時結果為0,否則為1。

^ 以位元異或運算:兩個二進位位元相同結果為0,不同結果為1。

~ 位元取反運算:對二進位位元取反,即0變成1,1變成0。

移位運算符號如下:

右移位運算:將二進位數向右移動指定的位數,高位補0或補1(取決於原數是正數還是負數)。
  1. 應用技巧

位元運算在電腦底層運算中被廣泛應用,透過一些巧妙的位元運算技巧能夠實現許多高效的演算法。以下介紹一些常用的技巧:

2.1 判斷奇偶性

對於一個二元數,它的最後一位為1時,數字為奇數,反之亦然。因此,我們可以透過位元運算來判斷一個數的奇偶性。

對於任一個整數n,n & 1 的結果若為0,則表示n為偶數,否則為奇數。例如:

int n = 5;
if( n & 1 ){

cout << "奇数" << endl;

}
else {

cout << "偶数" << endl;

}

# 2.2 交換兩個數的值

將兩個變數的值交換,一般的方法是使用第三個變數來儲存其中一個變數的值,然後再將另一個變數的值賦給它。但使用位元運算可以不需要使用額外的空間來存儲,而是直接透過位元異或運算來實現,即:

int a = 10, b = 20;
a = a ^ b ;
b = b ^ a;
a = a ^ b;

執行後,變數a的值為20,變數b的值為10,兩個變數的值實作了互換。

2.3 二進位中1的個數

在計算二進位數中1的個數時,可以使用&運算 右移位來逐個累加求解。具體實作方法如下:

int countOne(unsigned int n){
int count = 0;
while (n != 0){

   if (n & 1 == 1){
       count++;
   }
   n = n >> 1; //右移一位

}
return count;
}

2.4 取得二進位中的第i位

#我們可以使用左移位運算將數字1左移i - 1 位,再使用位元與運算& ,來取得二進制數中的第i 位。具體實作方法如下:

bool getBit(unsigned int n, int i){

return (n & (1 << i)) !=0 ;

}

2.5 將二進位數中的第i位元設為1

將數字1左移i 位,然後將這個二進制數與原來的數字進行按位或運算即可將原數中的第i位設為1。

unsigned int setBit(unsigned int n, int i){

return n | (1 << i);

}

2.6 將二進位數中的第i位元設為0

#將數字1左移i 位,然後將這個二進制數取反並與原來的數字進行按位與運算即可將原數中的第i位設為0。

unsigned int clearBit(unsigned int n, int i){

return n & ~(1 << i);

}

    ##應用實例
#位元運算在實際開發中也有很多應用,透過位元組位操作可以更有效率地完成一些相關任務。例如,在影像處理中,常常會將圖片的像素進行二值化,將其上限和下限設為0和255,將目標像素值變為0或255,使用位元運算可以實現高效處理,程式碼範例如下:

for (int i = 0; i
for (int j = 0; j < img.colnum(); j++){        
    if (img.at(i,j) < threshold){
        img.at(i,j) = 0; //设为0
    }
    else {
        img.at(i,j) = 255; //设为255
    }
}
}

透過對二進制數字的操作,還可以實現很多高效的演算法和資料結構,例如點陣圖、雜湊表等。

總之,位元運算是一種強大的工具,在程式設計上的應用十分廣泛。熟練掌握位元運算符號和技巧,能夠在實現高效演算法和資料結構,提高程式運作效率方面起到積極作用。

以上是C++中的位元運算及其應用技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn