位运算相关
1.两个数相加,不能用加号
两个数异或:相当于每一位相加,而不考虑进位;
两个数相与,并左移一位:相当于求得进位;
将上述两步的结果相加
public int Add(int num1,int num2) { while( num2!=0 ){ int sum = num1 ^ num2; int carray = (num1 & num2) << 1; num1 = sum; num2 = carray; } return num1; }
2.统计n的二进制中1的个数
,我们只需要知道n的二进制数中拿掉最右边的那个1的数的1的个数加1就行
public int[] countBits(int num){ int[] dp=new int[num+1]; for(int i=1;i<=num;i++){ dp[i]=dp[i&(i-1)]+1; } return dp; }
3.统计一个长数组中,唯一不成对的两个数。
如果是单独的一个数,就直接全部异或,单独的两个数首先求出他们两个的异或,然后再把这部分数分成两部分,分别与这个数异或,就可以把这两个数单独拿出来了。
public void findAlone(int[] a) { int hxor=0; int flag=1; for(int i=0;i<a.length;i++) { hxor^=a[i]; } //找到总的异或结果中从右往左的第一个1 while((hxor&flag)==0) flag<<=1; int num1=hxor; int num2=hxor; for(int i=0;i<a.length;i++) { if((a[i]&flag)==0) { num1^=a[i]; } else { num2^=a[i]; } } System.out.println(num1+"--"+num2); }
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/11238657.html

浙公网安备 33010602011771号