位运算
首先,先明确一下一个概念:位运算是通过二进制进行操作的。
首先来认识一下几个位运算的符号。
符号 |
名称 |
& |
与运算(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;
}
运行出来的结果是这样的:

这个也有需要注意的:位运算是在二进制的环境下操作的,而二进制最高位为符号位,即进行位操作时可能会把符号改变了。