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

C語(yǔ)言位運(yùn)算符的具體使用

 更新時(shí)間:2021年09月09日 11:28:01   投稿:zx  
位運(yùn)算是指按二進(jìn)制進(jìn)行的運(yùn)算。在系統(tǒng)軟件中,常常需要處理二進(jìn)制位的問(wèn)題。本文就詳細(xì)的介紹一下,感興趣的可以了解一下

對(duì)于更多緊湊的數(shù)據(jù),C 程序可以用獨(dú)立的位或多個(gè)組合在一起的位來(lái)存儲(chǔ)信息。文件訪問(wèn)許可就是一個(gè)常見的應(yīng)用案例。位運(yùn)算符允許對(duì)一個(gè)字節(jié)或更大的數(shù)據(jù)單位中獨(dú)立的位做處理:可以清除、設(shè)定,或者倒置任何位或多個(gè)位。也可以將一個(gè)整數(shù)的位模式(bit pattern)向右或向左移動(dòng)。

整數(shù)類型的位模式由一隊(duì)按位置從右到左編號(hào)的位組成,位置編號(hào)從 0 開始,這是最低有效位(least significant bit)。例如,考慮字符值'*',它的 ASCII 編碼為 42,相當(dāng)于二進(jìn)制的 101010:
位模式 0 0 1 0 1 0 1 0
位位置 7 6 5 4 3 2 1 0

在本例中,值 101010 被表示成一個(gè) 8 位的字節(jié)內(nèi)容,因此前面多兩個(gè) 0。

布爾位運(yùn)算符

表 1 中列舉的運(yùn)算符可以對(duì)操作數(shù)的每個(gè)位進(jìn)行布爾運(yùn)算。這種二元運(yùn)算符把兩個(gè)不同操作數(shù)內(nèi)相同位置的位關(guān)聯(lián)起來(lái)。被設(shè)定的位(也就是值為 1 的位)被解釋為 true,被清除的位(也就是值為 0 的位)被解釋為 false。

除布爾運(yùn)算符 AND、OR 和 NOT 以外,也有位異或運(yùn)算符(exclusive-OR,XOR)。這些都在表 1 進(jìn)行了列舉。

運(yùn)算符 意義 示例 對(duì)于每個(gè)位位置的結(jié)果(1=設(shè)定,0=清除)
    &     位 AND  x&y  如果 x 和 y 都為 1,則得到 1;如果 x 或 y 任何一個(gè)為 0,或都為0,則得到 0
    |     位 OR  x|y  如果 x 或 y 為 1,或都為 1,則得到 1;如果 x 和 y 都為 0,則得到 0
    ^     位 XOR  x^y  如果 x 或 y 的值不同,則得到 1;如果兩個(gè)值相同,則得到 0
    ~     位 NOT(I的補(bǔ)碼)  ~x  如果 x 為 0,則得到 1,如果 x 是 1,則得到 0

表1 布爾位運(yùn)算符

位運(yùn)算符的操作數(shù)必須是整數(shù)類型,并且遵循尋常算術(shù)轉(zhuǎn)換(usualarithmetic conversion)。轉(zhuǎn)換后獲得的操作數(shù)通用類型就是整個(gè)計(jì)算結(jié)果的類型。表 2 展示了這些運(yùn)算符的效果。

表達(dá)式(或聲明) 位模式
int a=6; 0···00110
int b=11; 0···01011
a&b 0···00010
a|b 0···01111
a^b 0···01101
~a 1···11001

表2 位運(yùn)算符的效果

可以將一個(gè)整數(shù) a 的特定位清除,做法是將整數(shù) a 和另一個(gè)整數(shù)進(jìn)行位 AND 運(yùn)算,其中,另一個(gè)整數(shù)在需要清除的位為 0,其他位則為 1,并位 AND 運(yùn)算,其中,另一個(gè)整數(shù)在需要清除的位為 0,其他位則為 1,并將 AND 運(yùn)算的結(jié)果賦值給整數(shù) a。

該另一個(gè)整數(shù),即位 AND 運(yùn)算的第二個(gè)操作數(shù),被設(shè)定為 1 的位置(稱為位掩碼),這些位置經(jīng)過(guò)位 AND 運(yùn)算,不會(huì)改變第一個(gè)操作數(shù)對(duì)應(yīng)位置的值。例如,一個(gè)整數(shù)與一個(gè)位掩碼 0xFF 進(jìn)行位 AND 運(yùn)算后,將保留最低位置的 8 個(gè)位,而會(huì)清除其他所有位的值:

a &= OxFF;            // 相當(dāng)于:a = a & OxFF;

在該示例中,復(fù)合賦值運(yùn)算符 &= 也會(huì)執(zhí)行 & 運(yùn)算。復(fù)合賦值運(yùn)算符與其他二元位運(yùn)算符具有類似的執(zhí)行方式,這里不再贅述。

位運(yùn)算符也可以用來(lái)生成位掩碼,以供以后的位運(yùn)算使用。例如,在位模式 0x20 中,只有位5被設(shè)定。因此表達(dá)式 ~0x20 會(huì)生成一個(gè)只有位 5 沒(méi)有被設(shè)定的位掩碼:

a &= ~0x20;             // 清除a中的位5

位掩碼 ~0x20 比 0xFFFFFFDF 更受歡迎,因?yàn)樗目梢浦残愿茫航Y(jié)果不會(huì)受到機(jī)器字大小的影響(同時(shí)也更方便人閱讀)。

也可以使用運(yùn)算符 |(OR)和 ^(XOR)來(lái)設(shè)定或清除特定位,下面是一個(gè)示例:

int mask = OxC;
a |= mask;              // 設(shè)定a的位2和位3
a ^= mask;              // 求反a的位2和位3

第二個(gè)轉(zhuǎn)換使用相同的位掩碼,它會(huì)將第一次轉(zhuǎn)換的結(jié)果再反轉(zhuǎn)一次。換句話說(shuō),b^mask^mask 會(huì)得到原來(lái) b 的值。這個(gè)操作可以用于交換兩個(gè)整數(shù)的值,而不需要使用第三個(gè)臨時(shí)變量:

a ^= b;                  // 等效于 a = a ^ b;
b ^= a;                 // 將a原來(lái)的值賦值給b
a ^= b;                 // 將b原來(lái)的值賦值給a

本例中的前兩個(gè)表達(dá)式等同于 b=b^(a^b)或 b=(a^b)^b。其結(jié)果等同于 b=a,副作用是 a 的值也被修改了,其修改后的值為 a^b。在這時(shí),第三個(gè)表達(dá)式具有如下副作用 a=(a^b)^a 或 a=b(使用 a 和 b 的原始值)。

移位運(yùn)算符

移位運(yùn)算符將左操作數(shù)的位模式移動(dòng)數(shù)個(gè)位置,至于移動(dòng)幾個(gè)位置,由右操作數(shù)指定。它們?nèi)绫?3 列舉。

運(yùn)算符 意義 示例 結(jié)果
<< 向左移位 x<<y x 的每個(gè)位向左移動(dòng) y 個(gè)位
>> 向右移位 x>>y x 的每個(gè)位向右移動(dòng) y 個(gè)位

表3 移位運(yùn)算符

移位運(yùn)算符的操作數(shù)必須是整數(shù)。在實(shí)際移位操作之前,兩個(gè)操作數(shù)都要進(jìn)行整數(shù)提升(promotion)。右邊操作數(shù)不可以為負(fù)值,并且必須少于左邊操作數(shù)在整數(shù)提升之后的位長(zhǎng)。如果不符合這些條件,程序運(yùn)行結(jié)果將無(wú)法確定。

移位運(yùn)算結(jié)果的類型等于左操作數(shù)在整數(shù)提升后的類型。下面示例的移位表達(dá)式具有 unsigned long 類型。

unsigned long n = 0xB,     // 位模式: 0 ... 0 0 0 1 0 1 1
         result = 0;
result = n << 2;          //              0 ... 0 1 0 1 1 0 0
result = n >> 2;          //              0 ... 0 0 0 0 0 1 0

在向左移位運(yùn)算時(shí),右邊多出來(lái)的位用 0 來(lái)填充。移動(dòng)超出左邊邊界的位則直接拋棄。向左移動(dòng) y 個(gè)位置,就等同于將左操作數(shù)乘以 2^{y}:如果左操作數(shù) x 是無(wú)符號(hào)類型,那么表達(dá)式 x<<y 的結(jié)果等于表達(dá)式 x×2^{y} 的值。因此,在前面的例子,n<<2 的值為 n×4,也就是 44。

在向右位移運(yùn)算時(shí),如果左操作數(shù)是無(wú)符號(hào)類型,或者左操作數(shù)是帶符號(hào)類型但為非負(fù)值,則左邊多出來(lái)的位用 0 來(lái)填充。在這種情況下,表達(dá)式 x>>y 的結(jié)果等效于表達(dá)式 x/2^{y} 的值。如果左操作數(shù)是負(fù)值,那么由編譯器決定用于填充至左邊多出來(lái)的位的內(nèi)容,可能是 0,也可能是符號(hào)位。

// 函數(shù)setBit()
// 設(shè)定掩碼m中p位置的位。
// 使用定義在limits.h中的CHAR_BIT,存儲(chǔ)一個(gè)字節(jié)內(nèi)的位的數(shù)目。
// 返回值: 完成位設(shè)定的新掩碼,其中p位置已設(shè)定好
//              如果p不是有效的位置,則返回原始掩碼。
unsigned int setBit( unsigned int mask, unsigned int p )
{
  if ( p >= CHAR_BIT * sizeof(int) )
    return mask;
  else
    return mask | (1<<p);
}

移位運(yùn)算符的優(yōu)先級(jí)比算術(shù)運(yùn)算符的優(yōu)先級(jí)更低,但相對(duì)于比較運(yùn)算符以及其他的位操作運(yùn)算符,具有更高的優(yōu)先級(jí)。上例表達(dá)式 mask|(1<<p)中的括號(hào)必要性不大,主要是讓程序代碼更容易閱讀。

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

相關(guān)文章

  • 關(guān)于C++中引用的定義與使用詳解

    關(guān)于C++中引用的定義與使用詳解

    這篇文章主要介紹了關(guān)于C++中引用和指針的區(qū)別,概念:引用是為已存在的變量取了一個(gè)別名,引用和引用的變量共用同一塊內(nèi)存空間,需要的朋友可以參考下
    2023-07-07
  • 深入理解C++中的vector類的用法及特性

    深入理解C++中的vector類的用法及特性

    vector直接翻譯過(guò)來(lái)為向量,在C++中為封裝動(dòng)態(tài)數(shù)組的容器,且有序,需要的朋友可以參考下
    2016-05-05
  • C++面試題之?dāng)?shù)a、b的值互換(不使用中間變量)

    C++面試題之?dāng)?shù)a、b的值互換(不使用中間變量)

    這篇文章主要介紹了不使用中間變量,C++實(shí)現(xiàn)數(shù)a、b的值互相轉(zhuǎn)換操作,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)圖文混排

    Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)圖文混排

    除了能夠打印基本的文字信息數(shù)據(jù)到pdf和紙張,越來(lái)越多的應(yīng)用需求還要求能夠?qū)С鰣D片,并且要支持圖文混排。本文將通過(guò)Qt實(shí)現(xiàn)這一功能,需要的可以參考一下
    2022-01-01
  • C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景

    右值引用和move語(yǔ)義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • C++中std::find函數(shù)介紹和使用場(chǎng)景

    C++中std::find函數(shù)介紹和使用場(chǎng)景

    std::find函數(shù)是一個(gè)非常實(shí)用的通用查找算法,適用于各種場(chǎng)景,本文主要介紹了C++中std::find函數(shù)介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C語(yǔ)言中使用fopen()打開和操作文件的詳細(xì)方法指南

    C語(yǔ)言中使用fopen()打開和操作文件的詳細(xì)方法指南

    fopen是C語(yǔ)言庫(kù)函數(shù),open是系統(tǒng)調(diào)用,mmap是將大文件映射到內(nèi)存中使用,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中使用fopen()打開和操作文件的詳細(xì)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)中哈希算法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,希望對(duì)大家有所幫助
    2022-12-12
  • C語(yǔ)言 指針的初始化賦值案例詳解

    C語(yǔ)言 指針的初始化賦值案例詳解

    這篇文章主要介紹了C語(yǔ)言 指針的初始化賦值案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C/C++中的名字空間與作用域示例詳解

    C/C++中的名字空間與作用域示例詳解

    這篇文章主要給大家介紹了關(guān)于C/C++中名字空間與作用域的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c/c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。
    2017-09-09

最新評(píng)論

七台河市| 清新县| 山阳县| 定陶县| 上虞市| 枣庄市| 左云县| 故城县| 崇仁县| 苏尼特右旗| 昌邑市| 静宁县| 万盛区| 乌兰县| 咸宁市| 西城区| 拜泉县| 温宿县| 金秀| 乌苏市| 龙江县| 桦南县| 井冈山市| 曲松县| 富阳市| 吉安县| 磐石市| 佳木斯市| 鹤庆县| 年辖:市辖区| 若尔盖县| 普兰店市| 临江市| 平武县| 女性| 泸州市| 海盐县| 都兰县| 汝阳县| 都安| 丽水市|