最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳細(xì)講解位運算符的使用

 更新時間:2022年04月19日 15:35:02   作者:清風(fēng)自在?流水潺潺  
C語?既具有?級語?的特點,?具有低級語?的特性,如?持位運算就是其具體體現(xiàn)。這是因為,C語?最初是為取代匯編語?設(shè)計系統(tǒng)軟件?設(shè)計的,因此C語?必須?持位運算等匯編操作。位運算就是對字節(jié)或字內(nèi)的?進制數(shù)位進?測試、抽取、設(shè)置或移位等操作

一、位運算符分析

C語言中的位運算符

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

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

左移和右移注意點

左操作數(shù)必須為整數(shù)類型

  • char 和 short 被隱式轉(zhuǎn)換為 int 后進行移位操作

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

左移運算符<< 將運算數(shù)的二進制位左移

  • 規(guī)則:高位丟棄,低位補0

右移運算符>> 把運算數(shù)的二進制位右移

  • 規(guī)則︰高位補符號位,低位丟棄

下面一段代碼:

#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;
}

下面為輸出結(jié)果:

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

二、小貼士

防錯準(zhǔn)則:

  • 避免位運算符,邏輯運算符和數(shù)學(xué)運算符同時出現(xiàn)在一個表達式中
  • 當(dāng)位運算符,邏輯運算符和數(shù)學(xué)運算符需要同時參與運算時,盡量使用括號 ( ) 來表達計算次序

小技巧:

  • 左移 n 位相當(dāng)于乘以 2 的 n 次方,但效率比數(shù)學(xué)運算符高
  • 右移 n 位相當(dāng)于除以 2 的 n 次方,但效率比數(shù)學(xué)運算符高

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

#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;
}                                                                           

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

注意第三種方法:執(zhí)行 a = a ^ b; 后,b = a ^ b; 就相當(dāng)于 b = a ^ b ^ b; 先計算后面的,就是 b = a ^ 0,結(jié)果就是 b = a;再執(zhí)行a = a ^ b;相當(dāng)于 a = a ^ b ^ b,即 a = a ^ b ^ a,顯然結(jié)果是 b。

小知識:

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

三、位運算與邏輯運算

位運算與邏輯運算不同:

  • 位運算沒有短路規(guī)則,每個操作數(shù)都參與運算
  • 位運算的結(jié)果為整數(shù),而不是 0 或 1
  • 位運算優(yōu)先級高于邏輯運算優(yōu)先級

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

#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;
}

下面為輸出結(jié)果:

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

四、小結(jié)

  • 位運算符只能用于整數(shù)類型
  • 左移和右移運算符的右操作數(shù)范圍必須為 [0,31]
  • 位運算沒有短路規(guī)則,所有操作數(shù)均會求值
  • 位運算的效率高于四則運算和邏輯運算
  • 運算優(yōu)先級:四則運算 > 位運算 > 邏輯運算

到此這篇關(guān)于C語言詳細(xì)講解位運算符的使用的文章就介紹到這了,更多相關(guān)C語言 位運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言 擴展歐幾里得算法代碼

    C語言 擴展歐幾里得算法代碼

    這篇文章介紹了擴展歐幾里得算法的實現(xiàn)代碼,有需要的朋友可以參考一下
    2013-09-09
  • C語言中qsort函數(shù)的用法實例詳解

    C語言中qsort函數(shù)的用法實例詳解

    這篇文章主要介紹了C語言中qsort函數(shù)的用法實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++ Boost Pool超詳細(xì)講解

    C++ Boost Pool超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++ 整數(shù)拆分方法詳解

    C++ 整數(shù)拆分方法詳解

    整數(shù)拆分,指把一個整數(shù)分解成若干個整數(shù)的和。本文重點給大家介紹C++ 整數(shù)拆分方法詳解,非常不錯,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • c++中queue用法超詳細(xì)講解(入門必看!)

    c++中queue用法超詳細(xì)講解(入門必看!)

    queue是一種容器轉(zhuǎn)換器模板,調(diào)用#include< queue>即可使用隊列類,下面這篇文章主要給大家介紹了關(guān)于c++中queue用法超詳細(xì)講解的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • C++ vector如何動態(tài)申請內(nèi)存的元素

    C++ vector如何動態(tài)申請內(nèi)存的元素

    vector是一種動態(tài)數(shù)組,本文主要介紹了C++ vector如何動態(tài)申請內(nèi)存的元素,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c++關(guān)鍵字mutable深入解析

    c++關(guān)鍵字mutable深入解析

    先說用法,mutable關(guān)鍵字只能修飾非靜態(tài)以及非常量成員變量,使用mutable修飾的成員變量在const函數(shù)中的值是可以修改的
    2013-09-09
  • c++實現(xiàn)排序算法之希爾排序方式

    c++實現(xiàn)排序算法之希爾排序方式

    這篇文章主要介紹了c++實現(xiàn)排序算法之希爾排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++實現(xiàn)簡單通訊錄管理系統(tǒng)

    C++實現(xiàn)簡單通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Linux環(huán)境下段錯誤的產(chǎn)生原因及調(diào)試方法小結(jié)

    Linux環(huán)境下段錯誤的產(chǎn)生原因及調(diào)試方法小結(jié)

    借此機會系統(tǒng)學(xué)習(xí)了一下,這里對Linux環(huán)境下的段錯誤做個小結(jié),方便以后同類問題的排查與解決
    2011-11-11

最新評論

普宁市| 泾川县| 云阳县| 陆良县| 江孜县| 沾益县| 隆尧县| 黄石市| 苏尼特右旗| 怀化市| 故城县| 延吉市| 辽阳县| 双江| 台安县| 厦门市| 文成县| 赣州市| 珲春市| 称多县| 和田市| 乃东县| 顺昌县| 荣成市| 玉龙| 阿拉尔市| 余干县| 庆城县| 滦南县| 格尔木市| 广昌县| 顺昌县| 潜江市| 金山区| 潍坊市| 丽江市| 章丘市| 太湖县| 沧源| 蒙山县| 广宁县|