C++ 位運(yùn)算的具體實(shí)現(xiàn)
任何信息在計(jì)算機(jī)中都是采用二進(jìn)制表示的,數(shù)據(jù)在計(jì)算機(jī)中是以補(bǔ)碼形式存儲的,位運(yùn)算就是直接對整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行運(yùn)算。由于位運(yùn)算直接對內(nèi)存數(shù)據(jù)進(jìn)行操作,不需要轉(zhuǎn)換成十進(jìn)制,因此處理速度非??臁?/p>
一、位運(yùn)算符
C++ 提供了按位與(&)、按位或(| )、按位異或(^)、取反(~)、左移(<<)、右移(>>)這 6 種位運(yùn)算符。 這些運(yùn)算符只能用于整型操作數(shù),即只能用于帶符號或無符號的 char、short、int 與 long 類型。
| & | 按位與 | 兩個位都為1時,結(jié)果才為1 |
| | | 按位或 | 兩個位都為0時,結(jié)果才為0 |
| ^ | 按位異或 | 兩個位相同為0,相異為1 |
| ~ | 取反 | 0變1,1變0 |
| << | 左移 | 各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0 |
| >> | 右移 | 各二進(jìn)位全部右移若干位,對無符號數(shù),高位補(bǔ)0,有符號數(shù),各編譯器處理方法不一樣,有的補(bǔ)符號位(算術(shù)右移),有的補(bǔ)0(邏輯右移) |
1:按位與運(yùn)算符(&)
“a&b”是指將參加運(yùn)算的兩個整數(shù)a和b,按二進(jìn)制位進(jìn)行“與”運(yùn)算。
運(yùn)算規(guī)則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩位同時為“1”,結(jié)果才為“1”,否則為0
例如:3&5 即 0000 0011& 0000 0101 = 0000 0001 因此,3&5的值得1。
另,負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算。
按位與&比較實(shí)用的例子:
1、比如我們經(jīng)常要用的是否被2整除,一般都寫成 if(n % 2 == 0) 可以換成 if((n&1) == 0)
2、按位與運(yùn)算可以取出一個數(shù)中指定位。例如:要取出整數(shù)84從左邊算起的第3、4、5、7、8位,只要執(zhí)行84 & 59,因?yàn)?4對應(yīng)的二進(jìn)制為01010100,59對應(yīng)的二進(jìn)制為00111011,01010100 & 00111011= 00010000 可知84從左邊算起的第3、4、5、7、8位分別是0、1、0、0、0。
3、清零。如果想將一個單元清零,使其全部二進(jìn)制位為0,只要與一個各位都為零的數(shù)值相與,結(jié)果為零。
與運(yùn)算的用途:
1)清零
如果想將一個單元清零,即使其全部二進(jìn)制位為0,只要與一個各位都為零的數(shù)值相與,結(jié)果為零。
2)取一個數(shù)的指定位
比如取數(shù) X=1010 1110 的低4位,只需要另找一個數(shù)Y,令Y的低4位為1,其余位為0,即Y=0000 1111,然后將X與Y進(jìn)行按位與運(yùn)算(X&Y=0000 1110)即可得到X的指定位。
3)判斷奇偶
只要根據(jù)最未位是0還是1來決定,為0就是偶數(shù),為1就是奇數(shù)。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來判斷a是不是偶數(shù)。
4)整數(shù)冪
判斷一個數(shù)n ,是不是2的整數(shù)冪。比如:64=2^6,所以輸出“yes”,而65無法表示成2的整數(shù)冪的形式,所以輸出“NO”。
#include<bits/stdc++.h>
using namespace std;
int main()
{ int n;
cin>>n;
if(n&(n-1))cout<<"NO";
else cout<<"Yes";
}2:按位或運(yùn)算符(|)
運(yùn)算規(guī)則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
或運(yùn)算的用途:
1)常用來對一個數(shù)據(jù)的某些位設(shè)置為1
比如將數(shù) X=1010 1110 的低4位設(shè)置為1,只需要另找一個數(shù)Y,令Y的低4位為1,其余位為0,即Y=0000 1111,然后將X與Y進(jìn)行按位或運(yùn)算(X|Y=1010 1111)即可得到。
3:按位異或運(yùn)算符(^)
運(yùn)算規(guī)則:0 ^ 0=0; 0 ^ 1=1; 1^ 0=1; 1^1=0;
異或的幾條性質(zhì):
- 1、交換律
- 2、結(jié)合律 (a^b)^c == a^(b^c)
- 3、對于任何數(shù)x,都有 x^x=0,x^0=x
- 4、自反性: a^b^b=a^0=a;
異或運(yùn)算的用途:
1)翻轉(zhuǎn)指定位
比如將數(shù) X=1010 1110 的低4位進(jìn)行翻轉(zhuǎn),只需要另找一個數(shù)Y,令Y的低4位為1,其余位為0,即Y=0000 1111,然后將X與Y進(jìn)行異或運(yùn)算(X^Y=1010 0001)即可得到。
2)與0相異或值不變
例如:1010 1110 ^ 0000 0000 = 1010 1110
4:按位取反運(yùn)算符(~)
按位取反運(yùn)算符(~)是指將整數(shù)的各個二進(jìn)制位都取反,即1變?yōu)?,0變?yōu)?。
5:左移運(yùn)算符(<<)
左移運(yùn)算符是用來將一個數(shù)的各二進(jìn)制位左移若干位,移動的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)值),其右邊空出的位用0填補(bǔ),高位左移溢出則舍棄該高位。
在高位沒有1的情況下,左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以2*2=4,15<<2=60,即乘了4。
但此結(jié)論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。
例如:143<<2 結(jié)果為60 因?yàn)?43轉(zhuǎn)換為進(jìn)制為10001111,左移2得00111100 ,結(jié)果為60。
定義:將一個運(yùn)算對象的各二進(jìn)制位全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)。
設(shè) a=1010 1110,a = a<< 2 將a的二進(jìn)制位左移2位、右補(bǔ)0,即得a=1011 1000。
若左移時舍棄的高位不包含1,則每左移一位,相當(dāng)于該數(shù)乘以2。
6:右移運(yùn)算符(>>)
定義:將一個數(shù)的各二進(jìn)制位全部右移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。
例如:a=a>>2 將a的二進(jìn)制位右移2位,左補(bǔ)0 或者 左補(bǔ)1得看被移數(shù)是正還是負(fù)。
操作數(shù)每右移一位,相當(dāng)于該數(shù)除以2。
7:復(fù)合賦值運(yùn)算符
位運(yùn)算符與賦值運(yùn)算符結(jié)合,組成新的復(fù)合賦值運(yùn)算符,它們是:
1、&= 例:a &=b 相當(dāng)于a=a& b
2、|= 例:a |=b 相當(dāng)于a=a |b
3、>>= 例:a >>=b 相當(dāng)于a=a>> b
4、<<= 例:a<<=b 相當(dāng)于a=a<< b
5、^= 例:a ^= b 相當(dāng) a=a ^b
到此這篇關(guān)于C++ 位運(yùn)算的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 位運(yùn)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中strstr函數(shù)的實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了C++中strstr函數(shù)的實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn)
這篇文章主要為大家介紹了C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C語言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點(diǎn)
這篇文章主要介紹了C語言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點(diǎn),主要涉及鏈表的遍歷操作,是數(shù)據(jù)結(jié)構(gòu)中鏈表的常見操作。需要的朋友可以參考下2014-09-09
vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-06-06
c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn)
本文主要介紹了c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02

