C++位操作概述

來源:互聯網
上載者:User

定義二進位變數:

一般是以八進位或者十六進位來定義,八位元以0開頭,十六進位數以0x開頭

例如int  a = 0x80, 這裡的80隻能表示8個二進位位,它表示的是int的低8位,前面的24個二進位位補0,所以a = 128;也可以 a = –0x80, 此時a = -128;8進位同理

需要注意的是:如果0x…能夠在整形內表示,則其預設是int,否則再看unsigned int能否表示,接著long long ,再接著unsigned long long (可以用cout<<typeid(0xF0).name();查看變數類型)

關於移位操作:

<< 左移位操作:從右邊開始用0補空位

>>右移位操作:對於無符號數從左邊開始補0;對於有符號數,或者補符號位,或者補0,由編譯器決定(gcc的編譯器是補符號位)

注意:移位的數目是負數或者移位出界時(最多隻能移位類型二進位位大小-1),這個操作符的行為是未定義的,可以參考C++移位元運算符,位操作只針對整數類型(int long等)或者char類型的資料

常用二進位位操作(如果沒強調,expr可以是無符號或有符號整數):具體請參考c_c++刁鑽問題各個擊破之位元運算及其執行個體(2)

1. 將expr的第n(n從0開始)位設定為1:  expr |= (1<<n);

2. 將expr的第n(n從0開始)位設定為0:    expr &= (~(1<<n));

3. 判斷expr的第n(n從0開始)位是否為1:bool b = expr &(1<<n);

4. 翻轉expr的第n(n從0開始)位:expr ^= (1<<n);

5. 將最右側的1翻轉成0:expr &= (expr-1)  (可以用來判斷二進位中1的個數,每次翻轉一個1,知道數字變為0)

6. 向右連續傳播最右側的1位:expr |= (expr-1)  (該操作使00101000 變為 00101111)

7. 檢查無符號數expr是否是2的整數次冪:if((expr&(expr-1))==0)return true; 即說明expr的二進位中只有一個1

8. 將右側的連續1位串翻轉成0位串,其他保持不變:expr = ((expr|(expr-1))+1)&expr

9. 檢查不帶正負號的整數expr是否等於2的兩個整數次冪之差 if(((expr|(expr-1))+1)&expr == 0)return true;  (只要說明:無符號數二進位中所有的1都在一起)

10. 對於整數expr,求最小的、比expr大的整數M,使得M與expr的二進位表示中有相同數目的1, 如下,具體可參考給力!高效!易懂!位元運算求組合

int NextN(int N){    int x = N&(-N);         int t = N+x;    return t | ((N^t)/x)>>2;}

需要注意的是:如果沒有比expr大且二進位中1相同的數,函數返回-1

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

11. 迴圈移位,以整形舉例,迴圈左移和右移函數如下

int rotateLeft(int a, unsigned int n)//迴圈左移n位{    n %= 32;    if(n == 0)return a;    return (a << n) | ((a & 0xFFFFFFFF) >> (32 - n));}    int rotateRight(int a, unsigned int n)//迴圈右移n位{    n %= 32;    if(n == 0)return a;    return ((a & 0xFFFFFFFF) >> n) | (a << (32 - n));}

例如:

a = 01111011,迴圈左移2位的正確結果是: b=11101101

b = a >> (8 - 2); //用來得到正常左移丟失的位和迴圈移位後其正確位置 //b=00000001;

a = a << 2; //a = 11101100

a = a | b; //a = 11101101

注意1:按照上面的例子,我們需要的是右移操作右邊補0;但是如果輸入是個負數,c++沒有規定右移操作是怎麼補位的,而大部分編譯器是補符號位,所以此時需要把這個負數轉化成不帶正負號的整數,這就是a & 0xFFFFFFFF的作用(0xFFFFFFFF的類型是unsigned int)

注意2:當n 超過32時,需要n = n%32 這相當於迴圈移了好幾圈;另外如果n = 0,那麼32-n = 32,而整數移位操作對於大於31的移動位元是未定義的行為(見上面移位操作那部分紅字注釋)

作者:cnblogs tenos

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。