位运算:
1.按位与:a&b
2.按位或:a|b
3.按位异或:a^b
4.按位取反:~a
5.左移:a<<b
6.带符号右移:a>>b
7.无符号右移:a>>>b(Java)C没有这个符号
1.and运算符&
通常用于二进制取位操作,例如:一个数and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制最末位为0的为偶数,为1的为奇数。
boolisEvenNum(num)
{
return !(num & 1)
}
101101----45
010110----22
----------
000100----4
2.or运算符|
1101101---109
1011001--89
-------
1111101--125
or运算通常用于二进制特定位上的无条件赋值,例如:一个数or1的结果就是把二进制最末位强行变成1,如果需要把二进制最末位变成0,对这个数or1之后再减1就可以了,其实际意义就是把这个数强行转变成最接近的偶数。
1101101
0000001
3.异或运算^
1011011----91
0100101--37
-------
1111110---126
相同为1,不同为0
异或运算交换两个数的值
a = a ^b
b = a^b
a = a^b
4.取反运算
b = ~a
5.左移运算
在二进制后面添加n个0
左移n位
a*(2^n)
6.右移运算
去掉后面n位
右移n位
a/(2^n)
示例代码:
//@biref 是否是偶数
bool isEvenNum(int num)
{
return !(num & 1);
}
//@biref 转换为最近的偶数,被转换的数可以是偶数,只不过,结果是他自己而已
int toEventNum(int num)
{
int result = 0;
//需要用括号将“|”运算括起来,不然,结果不对
return (num | 1) - 1;
}
void selfSwap(int &a,int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
int main()
{
//位运算
//1.and运算&
//计算101101&010110 = 000100
int a = 45 & 22;
cout << "a=" << a << endl;
//2.or运算|
for (int i = 0; i < 100;i++)
{
cout << "Num:" << i << ",EvenNum:" << toEventNum(i) << endl;
}
//3.xor运算^,异或运算
int b = 2;
int c = 5;
cout << "a=" << a << ",b=" << b << endl;
selfSwap(a, b);
cout << "a=" << a << ",b=" << b << endl;
//4.not运算,取反
int d = 100;
d = ~d;
int g = 300;
g = ~g;
unsigned int e = 100;
e = ~e;
unsigned int f = 300;
f = ~f;
cout << "d=" << d << "e=" << e<<",f="<<f<<",g="<<g<<endl;
//5.<<运算,左移运算,左移一位,相当于乘以2,
//通常认为,左移一位的效率要比乘以2要高,因为,位运算更接近底层。
//因此,在程序中用到乘以2^n的操作尽量用左移为运算来操作
int h = 5;
h = h << 2;
//h * 2^n:n是左移的位数,
//101101
//左移两位
//10110100---加两个0
cout << "h=" << h << endl;
//6.>>运算,右移运算,想办法用右移运算代替出发运算,会使代码效率大大提高
int i = 200;
i = i >> 2;
//i / (2^n)
//11001000
//右移2位
//110010
cout << "i=" << i << endl;
system("pause");
return 0;
}