欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言位運算符的具體使用

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

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

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

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

布爾位運算符

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

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

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

表1 布爾位運算符

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

表達式(或聲明) 位模式
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 位運算符的效果

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

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

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

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

位運算符也可以用來生成位掩碼,以供以后的位運算使用。例如,在位模式 0x20 中,只有位5被設(shè)定。因此表達式 ~0x20 會生成一個只有位 5 沒有被設(shè)定的位掩碼:

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

位掩碼 ~0x20 比 0xFFFFFFDF 更受歡迎,因為它的可移植性更好:結(jié)果不會受到機器字大小的影響(同時也更方便人閱讀)。

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

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

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

a ^= b;                  // 等效于 a = a ^ b;
b ^= a;                 // 將a原來的值賦值給b
a ^= b;                 // 將b原來的值賦值給a

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

移位運算符

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

運算符 意義 示例 結(jié)果
<< 向左移位 x<<y x 的每個位向左移動 y 個位
>> 向右移位 x>>y x 的每個位向右移動 y 個位

表3 移位運算符

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

移位運算結(jié)果的類型等于左操作數(shù)在整數(shù)提升后的類型。下面示例的移位表達式具有 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

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

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

// 函數(shù)setBit()
// 設(shè)定掩碼m中p位置的位。
// 使用定義在limits.h中的CHAR_BIT,存儲一個字節(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ōu)先級比算術(shù)運算符的優(yōu)先級更低,但相對于比較運算符以及其他的位操作運算符,具有更高的優(yōu)先級。上例表達式 mask|(1<<p)中的括號必要性不大,主要是讓程序代碼更容易閱讀。

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

相關(guān)文章

  • C/C++的文件IO函數(shù)你知道嗎

    C/C++的文件IO函數(shù)你知道嗎

    這篇文章主要為大家詳細介紹了C/C++的文件IO函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++前綴樹字典樹的學(xué)習(xí)與模擬實現(xiàn)代碼示例

    C++前綴樹字典樹的學(xué)習(xí)與模擬實現(xiàn)代碼示例

    這篇文章主要介紹了C++前綴樹字典樹的學(xué)習(xí)與模擬實現(xiàn)代碼示例,Trie又被稱為前綴樹、字典樹,所以當(dāng)然是一棵樹,上面這棵Trie樹包含的字符串集合是{in,inn,int,tea,ten,to},每個節(jié)點的編號是我們?yōu)榱嗣枋龇奖慵由先サ?需要的朋友可以參考下
    2023-07-07
  • C++中變量進行初始化的3種方法

    C++中變量進行初始化的3種方法

    本文主要介紹了C++中變量進行初始化的3種方法,包括用"=",構(gòu)造函數(shù)初始化以及統(tǒng)一初始化這三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C++智能指針讀書筆記

    C++智能指針讀書筆記

    本篇隨筆僅作為個人學(xué)習(xí)《C++ Primer》智能指針一節(jié)后的部分小結(jié),抄書嚴重,伴隨個人理解。主要介紹shared_ptr、make_shared、weak_ptr的用法和聯(lián)系
    2015-11-11
  • C++單例模式實現(xiàn)線程池的示例代碼

    C++單例模式實現(xiàn)線程池的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C++單例模式簡單實現(xiàn)一個線程池,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • 詳解C 語言項目中.h文件和.c文件的關(guān)系

    詳解C 語言項目中.h文件和.c文件的關(guān)系

    這篇文章主要介紹了詳解C 語言項目中.h文件和.c文件的關(guān)系的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中繼承基類與派生類的區(qū)別

    C++中繼承基類與派生類的區(qū)別

    這篇文章主要介紹了C++中繼承基類與派生類的區(qū)別,面向?qū)ο蟪绦蛟O(shè)計中最重要的一個概念是繼承。繼承允許我們依據(jù)另一個類來定義一個類,這使得創(chuàng)建和維護一個應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-05-05
  • C語言簡單實現(xiàn)計算字符個數(shù)的方法

    C語言簡單實現(xiàn)計算字符個數(shù)的方法

    這篇文章主要介紹了C語言簡單實現(xiàn)計算字符個數(shù)的方法,涉及C語言針對字符串的簡單遍歷與判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言編程題楊氏矩陣算法快速上手示例詳解

    C語言編程題楊氏矩陣算法快速上手示例詳解

    這篇文章主要為大家介紹了C語言編程題楊氏矩陣算法快速上手的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • C++二分查找(折半查找)算法實例詳解

    C++二分查找(折半查找)算法實例詳解

    這篇文章主要介紹了C++二分查找(折半查找)算法,結(jié)合實例形式詳細分析了二分查找算法的原理、思想、實現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05

最新評論