栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java的按位乘法和加法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的按位乘法和加法

让我们开始看乘法代码。这个想法实际上很聪明。假设您有以二进制形式编写的n 1和n 2。然后,您可以将n1视为两个幂的和:n2 = c 30 2 30 +
c 29 2 29 + … + c 1 2 1 + c 0 2 0,其中每个c i为0或1。那么您可以将乘积n 1 n 2视为

n 1 n 2 =

n 1(c 30 2 30 + c 29 2 29 + … + c 1 2 1 + c 0 2 0)=

n 1 c 30 2 30 + n 1 c 29 2 29 + … + n 1 c 1 2 1 + n 1 c 0 2 0

这有点密集,但是我们的想法是,两个数字的乘积由第一个数字乘以组成第二个数字的两个数字的乘方乘以第二个数字的二进制数字的值得出。

现在的问题是,我们是否可以在不进行任何实际乘法的情况下计算该和项。为了做到这一点,我们将需要能够读取n
2的二进制数字。幸运的是,我们可以使用班次进行操作。特别地,假设我们从n 2开始,然后只看最后一位。那是c 0。如果然后将值下移一个位置,则最后一位是c
0,依此类推。更一般而言,将n 2的值下移i个位置后,最低位将是c
i。要读取最后一位,我们可以对值与数字1进行按位与运算。它具有二进制表示形式,除最后一位数字外,其他所有位置均为零。由于任何n的0 AND n =
0,因此将清除所有最高位。此外,由于0 AND 1 = 0和1 AND 1 = 1,因此此操作将保留数字的最后一位。

好的-我们现在知道我们可以读取c i的值了;所以呢?好吧,好消息是我们还可以类似的方式计算级数n 1 2 i的值。特别是,请考虑值序列n 1 << 0,n
1 << 1,依此类推。每当您进行左移时,就等于乘以2的幂。这意味着我们现在拥有计算上述总和所需的所有组件。这是您的原始源代码,并对其进行了评论:

public static void bitwiseMultiply(int n1, int n2) {        int a = n1;        int b = n2;        int result = 0;        while (b != 0)    {                if ((b & 1) != 0)        {  result = result + a;        }                a <<= 1;                b >>>= 1;    }    System.out.println(result);}

希望这可以帮助!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号