在计算机中,数据都以二进制补码的形式存储,根据这一特点,适当采用位运算(bitwise operation)可以很巧妙地解决问题,同时运算效率更高。时刻牢记,最大的负数是-1,在计算机中,它的存储形式是全1。
位运算符
- 左移<< 和 右移>>
左移相当于乘以2,友谊相当于除以2.在计算机中,位运算比乘法、除法运算要快得多,所以适当采用移位运算取代乘除运算,能够提高运算效率。右移时要注意符号位的扩展。
- 按位与&
&运算的特点是可以将某些位置为0。
&运算也可用于提取某些特定的位。做法是定义一个mask,mask中对应要提取的位置为1,而其它位为0,将整数与mask做&运算,就可以提取出整数中相应的位。
- 按位或|
|运算的特点是,可以将指定的位元置为1。
- 按位异或^
以下运算的规律在解决问题时可能是会经常用到的。
x^x=0
bit^1=~bit x^(-1)=~x
bit^0=bit x^0=x
- 按位取反~
~运算的特点是将0和1点到。以下规律值得牢记,此规律对正整数或负整数都成立。
-x=~x+1
一些小技巧
位运算结合在一起,恶意巧妙地解决很多问题,下面就是一些bitwise trick。
- 交换两个int
void swap(int &x, int &y)
{
x = x^y;
y = x^y; //(x^y)^y = x^(y^y) = x^0 = x;
x = x^y; //(x^y)^x = (x^x)^y = 0^y = y;
}
最早以前,我所知道的交换方法是下面这样的
void swap(