leetcode刷题——一些算法技巧总结2.0
-
异或、与的一点总结(这些位运算真的是骚操作2333)
-
两个相同的数字:
a^a=0
-
取出一个数最右端为1的那一位:
a &=-a
其中
-a
是在计算机中就是a
的补码表示(这样所有的加法运算可以使用同一种电路完成),因为补码等于原码的反码+1,所以a&-a
就是a最右边一位为1,其他位为0的数
。另外:
~a = -a-1
已知负数的补码,求其原码:左右找1,此两1不变,中间取反。
-
x&x-1 ==0
-判断 是否是2的n次方。
-把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
-
x&1 最低位二进制数,可以用来判断奇偶
-
一个数字除以2
x>>1
效率更高
-
-
利用逻辑与
&&
的短路原理,可以实现类似if
判断的功能。例如:实现1+2+3+……+n
//1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0; //3.当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。 public int Sum_Solution(int n) { int sum = n; boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0); return sum; }
-
利用
&
和^
实现加法public int Add(int num1,int num2) { while(num2!=0){ int tmp=num1^num2; num2=(num1&num2)<<1;//进位 num1=tmp; } return num1; }