美文网首页蓝桥杯
算法基础课 1.3 位运算

算法基础课 1.3 位运算

作者: sakura579 | 来源:发表于2020-02-27 16:06 被阅读0次

    与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进制转其他进制方法

    相关文章

      网友评论

        本文标题:算法基础课 1.3 位运算

        本文链接:https://www.haomeiwen.com/subject/nvhfchtx.html