C/C++位運(yùn)算概述與應(yīng)用(一)

簡述位運(yùn)算

1.位運(yùn)算概述

從現(xiàn)代計(jì)算機(jī)中所有的數(shù)據(jù)二進(jìn)制的形式存儲(chǔ)在設(shè)備中。即0、1兩種狀態(tài),計(jì)算機(jī)對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行的運(yùn)算(+、-、*、/)都是叫位運(yùn)算,即將符號(hào)位共同參與運(yùn)算的運(yùn)算。

2.位運(yùn)算概覽

符號(hào) 描述 運(yùn)算規(guī)則
& 兩個(gè)位都為1時(shí),結(jié)果才為1
| 兩個(gè)位都為1時(shí),結(jié)果才為1
^ 異或 兩個(gè)位相同為0,相異為1
~ 取反 0變1,1變0
<< 左移 各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0
>> 右移 各二進(jìn)位全部右移若干位,對(duì)無符號(hào)數(shù),高位補(bǔ)0,有符號(hào)數(shù),各編譯器處理方法不一樣,有的補(bǔ)符號(hào)位(算術(shù)右移),有的補(bǔ)0(邏輯右移)

3.位運(yùn)算規(guī)則詳細(xì)描述

1)按位與運(yùn)算符(&)

定義:參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運(yùn)算。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v1, v2, v3, v4;
    v1 = 1 & 1;  //二級(jí)制表示 0001 & 0001 = 0001 = 1
    v2 = 3 & 4;  //二級(jí)制表示 0011 & 0100 = 0000 = 0
    v3 = 6 & 7;  //二級(jí)制表示 0110 & 0111 = 0110 = 6
    v4 = 18 & 24;//二級(jí)制表示 00010010 & 00011000 = 00010000 = 16 
    cout << v1 << " " << v2 << " " << v3 << " " << v4;
    return 0;
}

2)按位或運(yùn)算符(|)

定義:參加運(yùn)算的兩個(gè)對(duì)象,按二進(jìn)制位進(jìn)行“或”運(yùn)算。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v1, v2, v3, v4;
    v1 = 1 | 1;  //二級(jí)制表示 0001 | 0001 = 0001 = 1
    v2 = 3 | 4;  //二級(jí)制表示 0011 | 0100 = 0111 = 7
    v3 = 6 | 7;  //二級(jí)制表示 0110 | 0111 = 0111 = 7
    v4 = 18 | 24;//二級(jí)制表示 00010010 | 00011000 = 00011010 = 26 
    cout << v1 << " " << v2 << " " << v3 << " " << v4;
    return 0;
}

3)異或運(yùn)算符(^)

定義:參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“異或”運(yùn)算。
先大致講下什么是異或:
異或(xor)是一個(gè)數(shù)學(xué)運(yùn)算符。它應(yīng)用于邏輯運(yùn)算。異或的數(shù)學(xué)符號(hào)為“⊕”,計(jì)算機(jī)符號(hào)為“xor”。其運(yùn)算法則為:
a⊕b = (?a ∧ b) ∨ (a ∧?b)
如果a、b兩個(gè)值不相同,則異或結(jié)果為1。如果a、b兩個(gè)值相同,異或結(jié)果為0。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v1, v2, v3, v4;
    v1 = 1 ^ 1;  //二級(jí)制表示 0001 | 0001 = 0000 = 0
    v2 = 3 ^ 4;  //二級(jí)制表示 0011 | 0100 = 0111 = 7
    v3 = 6 ^ 7;  //二級(jí)制表示 0110 | 0111 = 0001 = 1
    v4 = 18 ^ 24;//二級(jí)制表示 00010010 | 00011000 = 00001010 = 10
    cout << v1 << " " << v2 << " " << v3 << " " << v4;
    return 0;
}

4)取反運(yùn)算符 (~)

定義:參加運(yùn)算的一個(gè)數(shù)據(jù),按二進(jìn)制進(jìn)行“取反”運(yùn)算。

~1=0
~0=1

5)左移運(yùn)算符(<<)

定義:將一個(gè)運(yùn)算對(duì)象的各二進(jìn)制位全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v1, v2, v3, v4;
    v1 = 1 << 3;; //二級(jí)制表示 0001 = 1000 = 8
    v2 = 3 << 2;;//二級(jí)制表示 0011 = 1100 = 12
    v3 = 6 << 5;  //二級(jí)制表示 00000110 = 11000000 = 192
    v4 = 18 << 1;//二級(jí)制表示 00010010 = 00100100 = 36
    cout << v1 << " " << v2 << " " << v3 << " " << v4;
    return 0;
}

6)右移運(yùn)算符(>>)

定義:將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int v1, v2, v3, v4;
    v1 = 12 >> 3;; //二級(jí)制表示 1100 = 0001 = 1
    v2 = 13 >> 2;;//二級(jí)制表示 1101 = 0011 = 3
    v3 = 56 >> 4;  //二級(jí)制表示 00111000 = 00000011 = 3
    v4 = 18 >> 1;//二級(jí)制表示 00010010 = 00001001 = 9
    cout << v1 << " " << v2 << " " << v3 << " " << v4;
    return 0;
}

相關(guān)位運(yùn)算的應(yīng)用可以看我另一篇博客
C/C++位運(yùn)算概述與應(yīng)用(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容