蓝桥杯

算法基础课 1.3 位运算

2020-02-27  本文已影响0人  sakura579

与0相与是消散
与1相与是保留

从左往右数还是从右往左数是一样的为了奇偶交换 此处就从左往右数了)

c为保留偶数位
d为保留奇数位
c往左移1位 d往右移1位 相异或
A与1相异或 为~A
A与0相异或为A

public class 整数的奇偶互换 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a =0b00000000_00000000_00000000_11111001;
        int b =f(a);
        System.out.println(b);
        System.out.println(Integer.toString(b,2));//转为二进制
    }
    private static int f(int num) {
        int a = 0xaaaaaaaa;//1010 1010...
        int b = 0x55555555;//0101 0101...
        return ((num&a)>>>1)^((num&b)<<1);
    }

}

整数10进制转2进制是
除以2 取余 留商...
小数10进制转2进制是
乘2 判断整数位 扣掉整数位 ...

public class 二级制表示 {
    public static void main(String[] args) {
        System.out.println(f(0.625d));
    }
    private static String f(double num) {
        StringBuilder sb = new StringBuilder("0.");
        while(num>0) {
            //乘2
            double r = num*2;
            //判断整数部分
            if(r>=1) {
                //拼接
                sb.append("1");
                //消掉整数部分
                num = r-1;
            }else {
                sb.append("0");
                num = r;
            }
            if(sb.length()>34) {//这里题没讲清楚 不包含0.为34 ,包含32
                System.out.println("ERROR");
                return "";
            }
        }
        return sb.toString();
    }
}
>>>0.101
package impo.位运算;

public class 出现k次与出现1次{
    /**
     * 2  2
     * 2  2
     * 2  2
     * 3  0 1
     * 4  1 1
     * 4  1 1
     * 4  1 1
     */
    public static void main(String args[]) {
        int [] arr =new int []{1,2,3,2,3,2,3,4,4,4,1,1,6};
        int len = arr.length;
        char [][] kRadix = new char[len][];//二维数组 每一行为每个数字转为k进制的每一位 
        int k = 3;//出现了三次 转为三进制
        int maxlen = 0;
        //转为k进制字符数组
        //对于每个数字
        for(int i=0;i<arr.length;i++) {
            //求每个数字的三进制字符串并翻转,然后转为字符串
            kRadix[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
            //一个数字 它的三进制字符数组的长度如果大于maxlen 就更新一下
            if(kRadix[i].length>maxlen) {
                maxlen = kRadix[i].length;//每一行存arr数组的值的三进制转换后并反转的字符数组
                //之所以反转 为了对齐低位好进行不进位运算
            }
        }
        //不进位加法 
        //最终resArr数组中值为 对应行上 所有位 的和
        int [] resArr = new int[maxlen];
        for(int i=0;i<len;i++) {//行
            for(int j=0;j<maxlen;j++) {//列
                if(j>=kRadix[i].length) {
                    resArr[j] +=0;//就是j大于当前这一行数组的长度(即maxlen大于这行数组的长度,空的就为0) 累加的时候就加0
                }else{
                    resArr[j] +=kRadix[i][j]-'0';//char类型转为int
                }
            }
        }
    
        //k进制转为10进制
        int res = 0;
        for(int i=0;i<maxlen;i++) {
            res += (resArr[i]%k)*(int)Math.pow(k, i);//k为3,第一位上i为0 第二位上i为1 第三位上i为2 
        }
        System.out.println(res);
    }
    

}

2个相同的2进制数做不进位加法 ,结果为0
10个相同的10进制数做不进位加法 ,结果为0
k个相同的k进制数做不进位加法 ,结果为0

巧秒解法
所有数先转为K进制 做K进制的不进位加法 剩下就是我们要的答案的K进制 再转回来
10进制转其他进制方法

上一篇 下一篇

猜你喜欢

热点阅读