C++ 位運(yùn)算的具體實(shí)現(xiàn)
任何信息在計(jì)算機(jī)中都是采用二進(jìn)制表示的,數(shù)據(jù)在計(jì)算機(jī)中是以補(bǔ)碼形式存儲(chǔ)的,位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行運(yùn)算。由于位運(yùn)算直接對(duì)內(nèi)存數(shù)據(jù)進(jìn)行操作,不需要轉(zhuǎn)換成十進(jìn)制,因此處理速度非常快。
一、位運(yùn)算符
C++ 提供了按位與(&)、按位或(| )、按位異或(^)、取反(~)、左移(<<)、右移(>>)這 6 種位運(yùn)算符。 這些運(yùn)算符只能用于整型操作數(shù),即只能用于帶符號(hào)或無(wú)符號(hào)的 char、short、int 與 long 類型。
& | 按位與 | 兩個(gè)位都為1時(shí),結(jié)果才為1 |
| | 按位或 | 兩個(gè)位都為0時(shí),結(jié)果才為0 |
^ | 按位異或 | 兩個(gè)位相同為0,相異為1 |
~ | 取反 | 0變1,1變0 |
<< | 左移 | 各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0 |
>> | 右移 | 各二進(jìn)位全部右移若干位,對(duì)無(wú)符號(hào)數(shù),高位補(bǔ)0,有符號(hào)數(shù),各編譯器處理方法不一樣,有的補(bǔ)符號(hào)位(算術(shù)右移),有的補(bǔ)0(邏輯右移) |
1:按位與運(yùn)算符(&)
“a&b”是指將參加運(yùn)算的兩個(gè)整數(shù)a和b,按二進(jìn)制位進(jìn)行“與”運(yùn)算。
運(yùn)算規(guī)則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩位同時(shí)為“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)算可以取出一個(gè)數(shù)中指定位。例如:要取出整數(shù)84從左邊算起的第3、4、5、7、8位,只要執(zhí)行84 & 59,因?yàn)?4對(duì)應(yīng)的二進(jìn)制為01010100,59對(duì)應(yīng)的二進(jìn)制為00111011,01010100 & 00111011= 00010000 可知84從左邊算起的第3、4、5、7、8位分別是0、1、0、0、0。
3、清零。如果想將一個(gè)單元清零,使其全部二進(jìn)制位為0,只要與一個(gè)各位都為零的數(shù)值相與,結(jié)果為零。
與運(yùn)算的用途:
1)清零
如果想將一個(gè)單元清零,即使其全部二進(jìn)制位為0,只要與一個(gè)各位都為零的數(shù)值相與,結(jié)果為零。
2)取一個(gè)數(shù)的指定位
比如取數(shù) X=1010 1110 的低4位,只需要另找一個(gè)數(shù)Y,令Y的低4位為1,其余位為0,即Y=0000 1111,然后將X與Y進(jìn)行按位與運(yùn)算(X&Y=0000 1110)即可得到X的指定位。
3)判斷奇偶
只要根據(jù)最未位是0還是1來(lái)決定,為0就是偶數(shù),為1就是奇數(shù)。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來(lái)判斷a是不是偶數(shù)。
4)整數(shù)冪
判斷一個(gè)數(shù)n ,是不是2的整數(shù)冪。比如:64=2^6,所以輸出“yes”,而65無(wú)法表示成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)常用來(lái)對(duì)一個(gè)數(shù)據(jù)的某些位設(shè)置為1
比如將數(shù) X=1010 1110 的低4位設(shè)置為1,只需要另找一個(gè)數(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、對(duì)于任何數(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),只需要另找一個(gè)數(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ù)的各個(gè)二進(jìn)制位都取反,即1變?yōu)?,0變?yōu)?。
5:左移運(yùn)算符(<<)
左移運(yùn)算符是用來(lái)將一個(gè)數(shù)的各二進(jìn)制位左移若干位,移動(dòng)的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)值),其右邊空出的位用0填補(bǔ),高位左移溢出則舍棄該高位。
在高位沒(méi)有1的情況下,左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以2*2=4,15<<2=60,即乘了4。
但此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位中不包含1的情況。
例如:143<<2 結(jié)果為60 因?yàn)?43轉(zhuǎn)換為進(jìn)制為10001111,左移2得00111100 ,結(jié)果為60。
定義:將一個(gè)運(yùn)算對(duì)象的各二進(jìn)制位全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)。
設(shè) a=1010 1110,a = a<< 2 將a的二進(jìn)制位左移2位、右補(bǔ)0,即得a=1011 1000。
若左移時(shí)舍棄的高位不包含1,則每左移一位,相當(dāng)于該數(shù)乘以2。
6:右移運(yùn)算符(>>)
定義:將一個(gè)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符的深入探討
本篇文章是對(duì)用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言正則表達(dá)式詳解 regcomp() regexec() regfree()用法詳解
C語(yǔ)言處理正則表達(dá)式常用的函數(shù)有regcomp()、regexec()、regfree()和regerror(),這里就為大家介紹一下,需要的朋友可以參考一下啊2018-04-04C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)
這篇文章主要介紹了C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

C++基于socket UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡(jiǎn)單聊天室功能

Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè)

C語(yǔ)言中求余弦值的相關(guān)函數(shù)總結(jié)