位运算
最近做LeetCode上面的题,好多都要进行位运算的操作,而且执行效率快的有点难以置信,所以,对此将位运算进行一次大总结
- 1.“按位与”运算符(&);
指的是参与运算的2个数,按二进制位进行“与”运算。如果相应的二进制数都位1,结果为1,否则为0;
00000011
&00000101
00000001(结果)
由此可知3&5=1;
-
2.“按位或”运算符(|)
2个相应二进制数进行“或”运算,只要有1个数为1,则结果为1; -
3.“异或”运算符(^)
若2个二进制数相同,结果为0,反之为1;
0^1=1;
0^0=0;
1^1=0;
- 4."取反”运算符(~)
一元运算符,求整数的二进制反码;
~77=8;
***example***
//计算m^n;
#int pow(int m,int n){ // 比较有局限性,但是运用位运算;
int sum=1;
while(n!=0){
if(n &1==1){
sum*=m;
}
m*=m;
n=n>>1;
}
return sum;
}
//LeetCode 50. (适合任意x^n)
double myPow(double x, int n){
if(n==0) return 1;
if(n<0) return 1/(x*myPow(x,-(n+1)));
if(n%2==0) return myPow(x*x,n/2);
else return x*myPow(x*x,(n-1)/2);
}
// 有一个整形数组,只有1个数出现了1次,其余都出现了2次,找出这个出现一次的数
int find(int a[],int aSize){
int t=a[0];
for(int i=1;i<aSize;i++){
t=t^a[i];
}
return t;
}
//交换2个数
int change(int *x,int *y){
*x=*x ^ *y;
*y=*x ^ *y;
*x=*x ^ *y;
}
`//`判断奇偶性
if(n&1==1){
n为奇数;
}`