package demo;
public class P3q1 {
public static void main(String[] args) {
int a=5;
int b=10;
System.out.println("[a]"+a+"[b]"+b);
//三次异或,交换a、b的值
a=a^b; //a=a^b
b=a^b; //b=(a^b)^b=a,异或满足结合律、交换律
a=a^b; //a=(a^b)^a=b
System.out.println("[a]"+a+"[b]"+b);
}
}
package demo;
import java.util.Arrays;
import java.util.Random;
public class P3q2 {
//长度31的数组中,放1~30和一个重复数字,每个元素只许访问1次,求解重复的数字
//相同数字异或,偶数个消去为0,奇数个还是本身;巧用异或,效率高
public static void main(String[] args) {
int n = 30;
int[] arr=new int[n+1];
for(int x=0;x<arr.length-1;x++) {
arr[x]=x+1;
}
arr[n]=new Random().nextInt(30)+1;
System.out.println(Arrays.toString(arr));
int temp=0;
for(int x=1;x<n+1;x++) {
temp=temp^x;
}
for(int x=0;x<arr.length;x++) {
temp=temp^arr[x];
}
System.out.println("[重复出现的数字]"+temp);
}
}
package demo;
import java.util.Random;
public class P5 {
//求二进制中1的个数
// (x-1)&x 可以去除最右边的1,那么1的个数=去除次数
public static void main(String[] args) {
int x=new Random().nextInt(10)+1;
int count=0;
System.out.println("x的值:"+x);
System.out.println("对应二进制:"+Integer.toString(x, 2));
while(x!=0) {
x=(x-1)&x;
count++;
}
System.out.println("1的个数:"+count);
}
}
package demo;
public class P7 {
//要求:交换二进制数字的奇偶位,如1~8位 0101 0110(86)交换后为 1010 1001(169)
public static void main(String[] args) {
int a=86;
System.out.println(a);
System.out.println(Integer.toString(a, 2));
int x=a&(0b10101010); //保留奇数位
int y=a&(0b01010101); //保留偶数位
int b=(x>>1)|(y<<1); //奇数位右移1位,偶数位左移1位,完成位置交换,然后再组合
System.out.println(b);
System.out.println(Integer.toString(b, 2));
}
}
package demo;
public class P8 {
//用二进制表示小数,小数点后超过10位报error
public static void main(String[] args) {
double x=0.625;
StringBuffer bs=new StringBuffer("0.");
while(x>0) {
x=x*2; //乘2取整
if(x>=1) {
bs.append('1');
x=x-1;
}
else {
bs.append('0');
}
if(bs.length()>12) {
System.out.println("error");
return;
}
}
System.out.println(bs.toString());
}
}