程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++位操作概述

C++位操作概述

編輯:關於C++

定義二進制變量:

一般是以八進制或者十六進制來定義,八進制數以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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved