首页 > Java > java教程 > 正文

Java怎么用位运算实现乘法运算

王林
发布: 2023-05-18 17:04:24
转载
1819人浏览过

十进制相乘

例如,26 * 15,在进行乘法操作时,我们一般这样算,先用5乘以6得到30,把0写下把3记在一边,再用5乘以2得到10再加上之前的3写在下面,得到130;计算完5再计算1分别乘以6和2把得到的结果26记在下面,然后把130和26相加(有错位)得到390。

Java怎么用位运算实现乘法运算

二进制相乘

看完了十进制的相乘,再来看下二进制的相乘,基本原理是一样的,也是以十字相乘法为例,计算 5 * 7。

5的二进制为101,7的二进制为111,来看下二进制的十字相乘法。

Java怎么用位运算实现乘法运算

立即学习Java免费学习笔记(深入)”;

可以看到二进制为101和二进制111用传统的方式来计算,得到的结果为100011,而二进制100011对应的十进制为35。
所以说,在计算的过程中,十进制和二进制的计算方式是一样的,当然这里就不进行举例和证明了。

思路分析

既然计算过程有了,那么怎么样用代码来实现呢?

我们再来看下上图中二进制的计算过程:

  • 先用二进制111的最后一位1 乘上 101 得到 101。

  • 再用二进制111的倒数第2位1 乘上 101 得到 101。

  • 再用二进制111的倒数第3位1 乘上 101 得到 101。

  • 得到的三个101进行二进制相加,得到 100011。

注意,第2步和第3步得到的结果101都往前挪了一位,相当于1010和10100,也就是最后相加的计算为:10100 + 1010 + 101 = 100011。

再来看得到最终相加的计算10100 + 1010 + 101 = 100011,也就是只要我们找到如何把数据转换为几位数的相加就可以了,因为之前已经实现了如何用位运算实现加法操作。

这三个数101、1010、10100的数量刚好与二进制111的个数相同,也就是二进制(上图下面那个乘数111)有几位就会产生几个数相加,如果是与11111相乘就会产生5个数相加。

再来看数据之前的关系:

  • 第一次相乘结果:101 = 101 + 0

  • 第二次相乘结果:1111 = 101

  • 第三次相乘结果:100011 = 101

从这里我们可以看到,每计算一次,101只需要向左移一次再加上上一次的计算结果就可以了。

那么,怎么知道要左移多少次呢?从这里例子中看,111每次计算后,向右移动一次,101也跟着向左移动一次,直到111只剩最后一位,则停止计算就好了。

代码实现

根据上面的思路,来实现一下代码:

// 用位运算实现加法
public static int add(int a, int b) {
    int sum = 0;
    while (b != 0) {
        sum = a ^ b;
        b = (a & b) << 1;
        a = sum;
    }
    return sum;
}

// 用位运算实现减法
public static int multi(int a, int b) {
    int res = 0;
    while (b != 0) {
        if ((b & 1) != 0) {
            res = add(res, a);
        }
        a <<= 1;
        b >>>= 1;
    }
    return res;
}
登录后复制

运行一下代码,看下结果:

Java怎么用位运算实现乘法运算

可以看到计算是正确的,而且还支持负数。

以上就是Java怎么用位运算实现乘法运算的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:亿速云网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号