位运算交换值、统计出现次数、交换位置(2022-02-02)

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());
        
    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容