美文网首页蓝桥杯
算法基础课 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 位运算

    与0相与是消散与1相与是保留 从左往右数还是从右往左数是一样的为了奇偶交换 此处就从左往右数了) c为保留偶数位d...

  • 4月

    算法基础课 排序()二分()高精度()前缀和与差分()双指针算法()位运算(), 离散化()区间合并() 链表与...

  • 高级运算符

    1:位运算 1.1:按位取反运算符(~) 例子 1.2:按位与运算符 例子 1.3:按位或运算符 例子 1.4:按...

  • 北大C++程序设计在线课笔记,位运算

    1.3 位运算位运算:用于对整数类型(int,char, long 等)变量中的某一位(bit),或者若干位进行操...

  • 递归、回溯、分治

    递归 (1)子集 方式一:递归算法 方式二:位运算算法 (2)子集II 方法一:递归算法 方法二:位运算 (3)组...

  • 位运算 算法

    位运算 算法 -1.与: &或: |非: !异或 : ^ 相同为 0, 不同为 1int 32 位 -> int ...

  • 第二节课

    1.3 计算机的硬件 1.3.1 硬件组成要素 1.3.2 运算器 二进制运算 位数也多,精度越高,8位、16位、...

  • 算法

    算法实战 | 图像处理, 宽度优先搜索, 位运算

  • 算法位运算总结

    在位运算之前,对二进制需要掌握的基础知识 正数的二进制,例如 5原码是 0000 0000 0000 0000 0...

  • 位运算小算法

    判断一个数是不是2的N次幂(能被2整除)swift篇 按照二进制中只有一个1的时候才是2的N次幂,例如000000...

网友评论

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

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