1. 程式人生 > >C++位操作

C++位操作

按位運算子允許按照位來操作整型變數,按位運算子可以應用於signed和unsigned整型,但是通常應喲你於unsigned型別。
按位運算子的一個常見的應用是在整型變數中使用單個的位來儲存資訊,該位有兩種狀態
移位運算子
移位運算子可以把整型變數中的內容向左或者向右移動指定的位數,>>向右移動 <<向左移動 移動變數兩端的位被捨棄
向左移動相當於乘以2 向右移動相當於除以2
位操作只適用於整型資料,對於float和double型別進行位操作會報錯
比如說有個number
number<<2    左移動2位
number>>2    右移動2位
number<<=2

相當於number=number<<2
number>>=2相當於number=number>>2
輸出的時候需要加括號限制,否則會有異常錯誤:
cout<<(number<<2);
cout<<(number>>2);
一般位操作都是操作無符號的數,但是有時候需要操作帶符號的數:
而對於帶符號操作取決於編譯器的實現,下面通過一個例子來看看:
signed char value=-104;    //10011000
value<<2;        //
value>>2;        //11100110

常用的按位運算子:
按位求反
按位與
按位異或 相同為0不同1
按位或
位操作的應用:
1 判斷奇偶
根據最後一位是0/1來判斷,是0為偶數,是1為奇數
    for(i=0;i<100;i++)
        if(i&1)
            cout<<"奇數:"<<i<<endl;
上述迴圈可以輸出100以內所有的奇數
2 交換兩數
    void swap(int& a,int& b){
        if(a!=b){
            a^=b;
            b^=a;
            a^=b;
        }
    }

可以將上述if函式體內的表示式合併:
首先需要知道^滿******換律
    a^=b;    a=a^b;
    b^=a;    b=b^a=b^(a^b);
    a^=b;    a=a^b=(a^b)^(b^(a^b));
3 變換符號
正數變負數 負數變正數
取反加1就可以得到負數
    int reversal(int a){
        return ~a+1;
    }
4 取絕對值
負數取反加1得到正數
正數直接返回,因此關鍵在於判斷數的正負
    int my_abs(int a){
        int i=a>>31;
        return i==0?a:(~a+1);
    }
還有另外一種勁爆的方法:
    int my_abs(int a){
        int i=a>>31;
        return ((a^i)-i);
    }
好吧 來個筆試的例子:
寫個函式,該函式可以得到一個位元組內1的個數,用兩種方法來實現
unsigned int onenum(char log){
    int i;
    unsigned int num=0,val;
    for(i=0;i<8;i++){
        val=log>>i;
        val&=1;//和1與
        if(val)
            num++;
    }
    return num;
}
unsigned int onetest(char log){
    int i;
    unsigned int num=0,val;
    for(i=0;i<8;i++){
        val=(~log)>>i;
        val&=0;
        if(!val)
            num++;
    }
    return num;
}
位操作有很多有趣的應用,這裡我們總結下高低位交換
給出一個16位無符號的整數,將前8位後8位轉換下
方法:左移8位|右移8位即可
#include <iostream>
template<class T>
void PrintBinary(T a){
    itn i;
    for(i=sizeof(a)*8-1;i>=0;i--){
        if(a>>i&1)
            cout<<"1";
        else
            cout<<"0";
        if(i%8)
            cout<<" ";
    }
    cout<<endl;
}
int main(){
    unsigned short a=3344520;
    PrintBinary(a);
    a=(a>>8)|(a<<8);
        PrintBinary(a);
    return 0;
}

參加運算的兩個資料,按二進位進行“與”運算。如果兩個相應的二進位都為1,則該位的結果值為1,否則為0。即

    0&0=0;0&1=0;1&0=0;1&1=1;

例如: 3&5 並不等於8,應該是按位與。

3 = 00000011

(&) 5 = 00000101

00000001

因此,3&5的值得1。如果參加&是負數運算的是負數(如-3 & -5),則以補碼形式表示為二進位制數,然後按位進行“與”運算。

按位與有一些特殊的用途:

(1)清零。 如果想將一個單元清零,即使其全部二進位為0,只要找一個二進位制數,其中各個位符合以下條件:原來的數中為1的位,新數中相應位為0。然後使二者進行&運算,即可達到清零目的。

如:原有數為00101011,另找一個數,設它為10010100,它符合以上條件,即在原數為1的位置上,它的位值均為0。將兩個數進行&運算:

00101011

(&) 10010100

00000000

其道理是顯然的。

當然也可以不用10010100這個數而用其他數(如01000100)也可以,只要符合上述條件即可。

(2)取一個數中某些指定位。如有一個整數a(2個位元組),想要其中的低位元組。

只需將a與(737)8按位與即可。


相關推薦

ORBSLAM2計算描述子距離——C++ 操作得到二進位制32int值中有多少個1

看ORBSLAM2時算描述子之間的距離時看到的神奇的位操作,特此記錄一哈。 unsigned int v = *pa ^ *pb; v = v - ((v >> 1) & 0x55555555); v = (v & 0x3333

C++操作與、或、非、異或、取反詳解

一、按位邏輯運算子 1,按位取反~ 如:~(10)結果位(01) ~var不會改變var的值,如果要改var值,可以為var=~var; 2,按位與& 有0得0,全1出1 var&=300等價於var=var&300 3,按位或| 有1出1,全

C 操作 左移32 錯誤

搬磚拼接64位數字,因高32位long未先強轉64,導致拼接失敗,順便發現個問題,32位變數左移32位等於原數值。C下位移操作為邏輯位移,全部左移補零後,數值應為零,結果和預期不符,遂查詢癥結所在。 程式碼如下: long i = 512; i = i <<

C++操作

按位運算子允許按照位來操作整型變數,按位運算子可以應用於signed和unsigned整型,但是通常應喲你於unsigned型別。 按位運算子的一個常見的應用是在整型變數中使用單個的位來儲存資訊,該位有兩種狀態 移位運算子移位運算子可以把整型變數中的內容向左或者向右移動指定

c++ 操作實現資料標誌獲取與更新

<strong><span style="font-size:18px;">#include "stdafx.h" #include <iostream> usin

C++ 操作 --取出short的高低位並相互轉換

C++ 位操作 --取出short的高低位 short sVal = 8; short 取高低位 BYTE bHIGH, bLow; 高位:bHIGH = sVal >>8; 低位:

C/C++操作技巧

KeyWord:   C/C++ 位操作 位操作技巧 判斷奇偶 交換兩數 變換符號 求絕對值 位操作壓縮空間 篩素數 位操作趣味應用 位操作筆試面試 位操作篇共分為基礎篇和提高篇,基礎篇主要對位操作進行全面總結,幫助大

C語言復習2之操作

位操作位操作 位操作是程序設計中對位模式按位或二進制數的一元和二元操作. 在許多古老的微處理器上, 位運算比加減運算略快, 通常位運算比乘除法運算要快很多. 在現代架構中, 情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算)。 位運算符 取反(~)是一元運算符, 對一個

c#判斷操作系統是32還是64

ping interop 64位 lin last 直接 run 遇到 roc 做一個c#項目時,遇到要獲取操作系統位數的問題,在網上找了幾個小時,都沒有找到比較完整的解決方案。話不多說,直接上可以運行的代碼(簡單、粗暴) using System.Runtime.Con

(C/C++學習)17.bitset(操作)

說明:bitset 就像 vector 一樣,是 C++ 的一個類模板庫,用來對一個數的二進位制位進行管理、判斷等操作,使用時需要包含標頭檔案 #include<bitset>。 1.宣告及定義 格式:bitset<N> var(M) 其中 varm 為 bitset 的類物件,N

C語言高階篇 - 2.C語言操作

1、位操作符         (1)位與&         (2)位或|         (3)位取反~      

C語言的操作

C語言的位操作 轉載自https://www.cnblogs.com/nibuyaoni/p/5547795.html c語言的位操作最常用的地方就是用在對暫存器的寫值上。 1.位與:& 操作:1 & 1 = 1;  1 & 0 =

C Primer Plus--操作

位欄位 bit field 位欄位是一個signed int或者unsigned int中一組相鄰的位。位欄位由一個結構宣告建立,該結構宣告為每個欄位提供標籤,並決定欄位的寬度。 struct p { unsigned int autfd : 1;//autfd欄位佔一個int其中的1位

常見操作及運算應用舉例:1,C語言中運算子異或“∧”的作用2,異或運算的作用3,&(與運算)、|(或運算)、^(異或運算)

  1 C語言中位運算子異或“∧”的作用: 異或運算子∧也稱XOR運算子。它的規則是若參加運算的兩個二進位同號,則結果為0(假);異號則為1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,結果為023(八進位制數)。 “異或”的意思是判斷兩個相應的位值是否為“

嵌入式C語言之操作詳解

1.位操作符:     位操作直接將兩個運算元按照二進位制對應進行操作;     例:0xaa&(位與)0xf0=0xa0;     邏輯操作是  兩個運算元整體來操作;     例

原碼、反碼、補碼及操作符,C語言操作

計算機中的所有資料均是以二進位制形式儲存和處理的。所謂位操作就是直接把計算機中的二進位制數進行操作,無須進行資料形式的轉換,故處理速度較快。 1、原碼、反碼和補碼 位(bit) 是計算機中處理資料的最小單位,其取值只能是 0 或 1。 位元組(Byte)

51微控制器【二】LED閃爍及流水燈附帶c語言操作

void main(void) { while (1) { gLed1 = 0; // 點亮LED Delay(); // 延時一段時間 gLed1 = 1; // 熄滅LED Delay(); // 延時一段時間 } } voi

C語言——操作

C語言——位操作 宗旨:技術的學習是有限的,分享的精神是無限的。 一、基本位操作 | 或 & 與 ~ 取反 ^ 異或 <<  左移 >>  右移 二、位操作的常見用法 1.獲取某位的值

學習C語言中的操作

最近在寫程式時,我需要判斷一個DWORD 型別變數的某一個二進位制位是否為1或0, 我們都很清楚,DWORD型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1, 該如何是好呢?這時我想到了C語言中的位操作,藉助位操作,可以實現我們想要的功能。關於位操作,我從

[C/C++筆試面試題] 程式設計基礎 - 操作、函式、陣列篇

7 位操作 二進位制是現代計算機發展的基礎,所有的程式程式碼都需要轉換成最終的二進位制程式碼才能執 行。合理地進行二進位制的位操作,對於編寫優質程式碼,特別是嵌入式應用軟體開發非常關鍵。 7.1 一些結構宣告中的冒號和數字是什麼意思? c語言的結構體可以實現位段,它的定義形式是在一個定義的結構體成員後面