/*
假设有11个数,其中1-10各一个,其中有一个数有2个,找出这个数;
根据性质1^2^2^3^1^2^3 = 2
*/publicstaticvoidmain(String[] args){int[] arr ={1,2,3,3,4,5,6,7,8,9,10};int num =0;for(int i =0; i < arr.length; i++){
num = num ^ arr[i];}for(int i =1; i < arr.length; i++){
num = num ^ i;}
System.out.println(num);}
数二进制中1的个数
//根据x&(x-1)可以消除最后一个1,消除到x=0的次数publicstaticvoidmain(String[] args){int num =999;//System.out.println(Integer.toString(num, 2));int count =0;while(num !=0){
num = num &(num-1);
count++;}
System.out.println(count);}
/*
1.一个数与0101...0101(0xaaaaaaaa)做与运算,保留奇数位,偶数位全为0;将得到的数左移
2.一个数与1010...1010(0x55555555)做与运算,保留偶数位,奇数位全为0;将得到的数右移
3.将左右移后的数异或即得到结果
*/publicstaticvoidmain(String[] args){int num =9;//一个1010用16进制是a,int是32位的1010...,即8个aint even = num &0xaaaaaaaa;//0101对应16进制即5,8个5int odd = num &0x55555555;
System.out.println((even>>1)^(odd<<1));}
0-1之间浮点实数的二进制表示
//将一个double数转成二进制表示,如果小数点后32位无法表示,则返回ERRORpublicstaticvoidmain(String[] args){double a =0.625;
StringBuilder stringBuilder =newStringBuilder("0.");while(a >0){//将数字*2double r = a *2;if(r >=1){//*2后的数字大于1,则该位为1,将*2的数-1
stringBuilder.append("1");
a = r -1;}else{//*2后的数小于1,则该位为0,该数等于*2的数
stringBuilder.append("0");
a = r;}if(stringBuilder.length()>34){
System.out.println("ERROR");return;}}
System.out.println(stringBuilder.toString());}