亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言位運算符如何使用

發布時間:2022-04-19 17:14:29 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

本篇內容介紹了“C語言位運算符如何使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、位運算符分析

C語言中的位運算符

位運算符直接對 bit 位進行操作,其效率最高。

&按位與
|按位或
^按位異或
~取反
<<左移
>>右移

左移和右移注意點

左操作數必須為整數類型

  • char 和 short 被隱式轉換為 int 后進行移位操作

右操作數的范圍必須為:[0,31]

左移運算符<< 將運算數的二進制位左移

  • 規則:高位丟棄,低位補0

右移運算符>> 把運算數的二進制位右移

  • 規則︰高位補符號位,低位丟棄

下面一段代碼:

#include <stdio.h>
int main()
{
    printf("%d\n", 3 << 2); 
    printf("%d\n", 3 >> 1); 
    printf("%d\n", -1 >> 1); 
    printf("%d\n", 0x01 << 2 + 3);
    printf("%d\n", 3 << -1); // oops!
    return 0;
}

下面為輸出結果:

C語言位運算符如何使用

注意四則運算優先級大于位運算,所以 0x01 << 2 + 3 的結果是 32。 還有就是右操作數的范圍必須為:[0,31],如果不在這個范圍內,程序的輸出結果由不同類型的編譯器所決定,結果將不確定,就像本代碼 3 << -1 一樣。

二、小貼士

防錯準則:

  • 避免位運算符,邏輯運算符和數學運算符同時出現在一個表達式中

  • 當位運算符,邏輯運算符和數學運算符需要同時參與運算時,盡量使用括號 ( ) 來表達計算次序

小技巧:

  • 左移 n 位相當于乘以 2 的 n 次方,但效率比數學運算符高

  • 右移 n 位相當于除以 2 的 n 次方,但效率比數學運算符高

下面看一段交換兩個整型變量值的代碼:

#include <stdio.h>
 
#define SWAP1(a,b)  \
{                   \
    int t = a;      \
    a = b;          \
    b = t;          \
}    
 
#define SWAP2(a,b)  \
{                   \
    a = a + b;      \
    b = a - b;      \
    a = a - b;      \
}     
 
#define SWAP3(a,b)  \
{                   \
    a = a ^ b;      \
    b = a ^ b;      \
    a = a ^ b;      \
}   
 
int main()   
{
    int a = 1;
    int b = 2;
    
    //printf("a = %d\n", a);
    //printf("b = %d\n", b);
    
    SWAP1(a,b);
    
    printf("a = %d\n", a);
    printf("b = %d\n\n", b);
    
    a = 1;
    b = 2;
    
    SWAP2(a,b);
    
    printf("a = %d\n", a);
    printf("b = %d\n\n", b);
    
    a = 1;
    b = 2;
    SWAP3(a,b);
    
    printf("a = %d\n", a);
    printf("b = %d\n\n", b);   
    
    return 0;
}

第一種方法需要引入第三方變量,第二種方法可能會導致越界問題,第三種的方法效率較高,且不用引入第三方變量。

注意第三種方法:執行 a = a ^ b; 后,b = a ^ b; 就相當于 b = a ^ b ^ b; 先計算后面的,就是 b = a ^ 0,結果就是 b = a;再執行a = a ^ b;相當于 a = a ^ b ^ b,即 a = a ^ b ^ a,顯然結果是 b。

小知識:

A 異或 0 等于 A ,A 異或 1 等于 非A。

三、位運算與邏輯運算

位運算與邏輯運算不同:

  • 位運算沒有短路規則,每個操作數都參與運算

  • 位運算的結果為整數,而不是 0 或 1

  • 位運算優先級高于邏輯運算優先級

下面再來看一個混淆改變的判斷條件:

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    if( ++i | ++j & ++k )
    {
        printf("Run here...\n");
    }
    printf("i = %d, j = %d, k = %d\n\n", i, j, k);
    i = 0;
    j = 0;
    k = 0;
     if( ++i || ++j && ++k )
    {
        printf("Run here...\n");
    }
    printf("i = %d, j = %d, k = %d\n\n", i, j, k);
    return 0;
}

下面為輸出結果:

C語言位運算符如何使用

可以看到,如果錯把++i || ++j && ++k 寫成++i | ++j & ++k,雖然都能運行,但是其中的執行細節不一樣,在實際工程中可能會出現 bug,而且還不好排查。

“C語言位運算符如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳池县| 清水河县| 肇州县| 信宜市| 吴旗县| 望奎县| 长宁区| 扬州市| 四会市| 北安市| 崇文区| 佛冈县| 文水县| 冷水江市| 汉寿县| 乌海市| 邻水| 呈贡县| 扬中市| 枞阳县| 新密市| 哈巴河县| 绥芬河市| 上饶县| 浦县| 廉江市| 浮梁县| 金阳县| 略阳县| 潼关县| 丰顺县| 南召县| 淳安县| 库伦旗| 耿马| 电白县| 南涧| 温宿县| 恩施市| 石景山区| 清镇市|