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

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

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

一、位運(yùn)算符分析

C語(yǔ)言中的位運(yùn)算符

位運(yùn)算符直接對(duì) bit 位進(jìn)行操作,其效率最高。

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

左移和右移注意點(diǎn)

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

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

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

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

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

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

  • 規(guī)則︰高位補(bǔ)符號(hào)位,低位丟棄

下面一段代碼:

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

二、小貼士

防錯(cuò)準(zhǔn)則:

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

小技巧:

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

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

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

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

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

小知識(shí):

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

三、位運(yùn)算與邏輯運(yùn)算

位運(yùn)算與邏輯運(yùn)算不同:

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

下面再來(lái)看一個(gè)混淆改變的判斷條件:

#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é)果:

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

四、小結(jié)

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

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

相關(guān)文章

  • C語(yǔ)言 擴(kuò)展歐幾里得算法代碼

    C語(yǔ)言 擴(kuò)展歐幾里得算法代碼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

宁德市| 兴文县| 临澧县| 分宜县| 大冶市| 冷水江市| 谢通门县| 九龙城区| 藁城市| 鄂尔多斯市| 江油市| 阳朔县| 阳东县| 慈利县| 温州市| 桦甸市| 修文县| 乐陵市| 集安市| 德格县| 芮城县| 确山县| 西吉县| 洞头县| 苍溪县| 武邑县| 临高县| 临夏市| 张家界市| 喀喇沁旗| 湘潭市| 那曲县| 东丽区| 河间市| 云梦县| 台北县| 中阳县| 合肥市| 乐陵市| 邹平县| 武夷山市|