位运算

最近做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为奇数;
}`