哇,连续几天都做了dp,本来今天要继续的,但是,碰到一道貌似比较难的题吧。所以再思索一天,今天为位运算开一个头。
首先,十进制数是用来人类看的,而数据在计算机中是进行二进制存储的,有时我们可以运用一些二进制数的独有的特性来进行一些问题的优化。
由于二进制数都是0或1,所以这就涉及到了位运算。
& 按位与 a&=b ---> a=a&b
| 按位或
^ 按位异或 相同的数进行异或等于0,任何数与0异或结果都为本身。
>> 位右移 a>> =1 ---> a=a>>1 如 10001 右移一位变成 01000 (高位补0,负数由计算机决定)
<< 位左移 左移
下面有几个运用的小点:
第一个是,两数交换的操作。
一般来说,两数交换是需要另开一个辅助空间的,但是运用异或是可以避免的。
例如交换x,y;
x=x^y;
y=x^y; //y=x^y^y --->y=x^0 ---> y=x;
x=x^y;
第二个就是快速幂运算:
int x;
int p=1;
int n;;
cin >>x >> n;
while(n>0){
if(n&1){
p*=x;
}
x*=x;
n>>=1;
}
cout << x;