位運算
首先,先明確一下一個概念:位運算是通過二進制進行操作的。
首先來認識一下幾個位運算的符號。
符號 |
名稱 |
& |
與運算(and) |
| |
或運算(huo) |
<< |
左移 |
>> |
右移 |
~ |
取反 |
^ |
異或 |
① &
這個就是比較兩個二進制數,只有在這兩個數的第i位同時是1時,答案的第i位就變成1。也就是說在這一位上,只有兩個都是1,答案才能是1。
② |
這個或運算有點像&,但是它是只要在第i位上兩個數中有1個是1,那麼答案就是1.
③ <<
這個就是把一個數轉換成二進制後,整體向左移i位,剛補進來的都爲0。
④ >>
這個有點像>>,不過它是向右移。也就是把一個數轉換成二進制後,整體向右移i位。
⑤ ~
這個就是在二進制中,把所有1變成0,把所有0變成1。
⑥ ^
這個就是比較兩個二進制數,如果第i位相同,那麼答案的第i位就是0,否則就是1。
下面就編一個程來更加了解位運算吧!
/*
位運算 ——2015年8月6日10:34:49
*/
#include <iostream>
using namespace std;
long long a=7; /*00000111*/
long long b=4; /*00000100*/
int main()
{
cout<<"& :"<<(a&b)<<endl;
/*
a: 00000111 兩數同位爲1時答案爲1
b: 00000100
______________
00000100 ------ 4
*/
cout<<"| :"<<(a|b)<<endl;
/*
a: 00000111 兩數同位有一位爲1時答案爲1
b: 00000100
______________
00000111 ------7
*/
cout<<"<<:"<<(a<<1)<<endl;
/*
a: 00000111 a<<n
<== 左移n位
a: 00001110 ------14
*/
cout<<">>:"<<(a>>1)<<endl;
/*
a: 00000111 a>>n
==> 右移n位
a: 00000011 ------3
注意最後一位的1右移之後就沒了
*/
cout<<"~ :"<<(~a)<<endl;
/*
a: 00000111
~a: 11111000 ------ -8 (這裏是負數是因爲符號位也被取反了
原來的每一位如果是1就變成0,如果是0就變成1
*/
cout<<"^ :"<<(a^b)<<endl;
/*
a: 00000111 兩數同位相同時時答案爲0,否則爲 1
b: 00000100
______________
00000011 ------3
*/
return 0;
}
運行出來的結果是這樣的:
這個也有需要注意的:位運算是在二進制的環境下操作的,而二進制最高位爲符號位,即進行位操作時可能會把符號改變了。