目录
1.位运算与进制基础
2.题解
位运算符:
在处理整型数值时,可以直接对组成整形数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位(??)
&(与),|(或),^(异或),~(非/取反)
>>和<<运算符将二进制进行右移或者左移操作
>>>运算符将用0填充高位;>>运算符用符号位填充高位,没有<<<运算符
对于int型,1<<35与1<<3是相同的,而左面的操作数是long型时需对右侧操作数模64
与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1
位运算的奇巧淫技
判断奇偶数 x&1=1 奇数 x&1=0 偶数
获取二进制位是1还是0(两种解决方案)
交换两个整数变量的值
不用判断语句,求整数的绝对值
异或可理解为不进位加法:1+1=0,0+0=0,1+0=1;
性质
1.交换律 可任意交换运算因子的位置,结果不变
2.结合律 (即(a^b)^c==a^(b^c))
3.对于任何数x,都有x^x=0,x^0=x,同自己求异或为0,同0求异或为自己
4.自反性A^b^b=A^0=A,连续和同一个因子做异或运算,最终结果为自己
题1:找出唯一成对的数
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现
import java.util.Arrays; import java.util.Random; public class _01唯一成对的数 { /** * 在数组内原址交换元素 * * @param arr * @param i * @param j */ public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void print(int[] arr) { System.out.println(Arrays.toString(arr)); } public static void main(String[] args) { int N=1001; int []arr=new int[N]; for(int i=0;i<arr.length-1;i++){ arr[i]=i+1; } //最后一个数,是随机数 arr[arr.length-1] = new Random().nextInt(N-1)+1; //随机下标 int index = new Random().nextInt(N); swap(arr, index, arr.length-1); print(arr); int x1=0; for(int i=1;i<=N-1;i++){ x1=x1^i; } for(int i=0;i<N;i++){ x1=x1^arr[i]; } System.out.println(x1); System.out.println("-------"); int []helper=new int[N]; for(int i=0;i<N;i++){ helper[arr[i]]++; } for(int i=0;i<N;i++){ if(helper[i]==2){ System.out.println(i); break; } } } }