码迷,mamicode.com
首页 > 其他好文 > 详细

位运算题目

时间:2019-05-31 21:58:53      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:color   span   进制   怎么   位运算   连续   题目   nbsp   ret   

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

 

位运算题目

标签:color   span   进制   怎么   位运算   连续   题目   nbsp   ret   

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10957514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!