簡(jiǎn)述位運(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ì)無(wú)符號(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)用(二)