• 位运算题目


    m的n次方

    如果让你求解 m 的 n 次方,并且不能使用系统自带的 pow 函数,你会怎么做呢?这还不简单,连续让 n 个 m 相乘就行了,代码如下:

    int pow(int n){
        int tmp = 1;
        for(int i = 1; i <= n; i++) {
            tmp = tmp * m;
        }
        return tmp;
    }

    如果让你用位运算来做,你会怎么做呢?

    我举个例子吧,例如 n = 13,则 n 的二进制表示为 1101, 那么 m 的 13 次方可以拆解为:

    m^1101 = m^0001 * m^0100 * m^1000。

    我们可以通过 & 1和 >>1 来逐位读取 1101,为1时将该位代表的乘数累乘到最终结果。直接看代码吧,反而容易理解:

    int pow(int n){
            int sum = 1;
            int tmp = m;
            while(n != 0){
                if((n & 1) == 1){
                    sum *= tmp;
                }
                tmp *= tmp;
                n = n >> 1;
            }
    
            return sum;
        }

     二进制中1的个数

    基础的方法就是每次&1,如果为1个数加1,再无符号右移。循环,直到数字变为0。

    更高效的方法:

    原理:把一个整数减去1,再和原来的整数做相与运算,会把该整数二进制的最右边的1变成0。

    那么根据上述的原理,一个整数中有多少个1,就可以进行多少次上述的相与运算。根据这种思路,可以写出更加高效的算法。

    public int xx(int n) {
            int res = 0;
            while (n != 0) {
                n = n & (n - 1);
                res++;
            }
            return res;
        }
  • 相关阅读:
    使用canvas技术在网页上绘制鲜花
    java连接Access数据库
    L2-009. 抢红包
    L2-008. 最长对称子串
    L1-032. Left-pad
    L1-016. 查验身份证
    L1-005. 考试座位号
    L1-030. 一帮一
    L1-023. 输出GPLT
    L1-028. 判断素数
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10957514.html
Copyright © 2020-2023  润新知