• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

聊聊Java BigInteger里面的mod和remainder的区别

java 搞代码 4年前 (2022-01-05) 33次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了聊聊Java BigInteger里面的mod和remainder的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

BigInteger里的mod和remainder区别

下面直接上图吧,稍后解释关于mod和remainder以及负数求余求模的区别。

mod是模运算,remainder是求余运算

如果被除数是正整数,mod和remainder的结果没区别。mod运算除数只能为正数。

取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。

假设有式子a ÷ b = c ・・・ r

当a和b符号一致时的情况:a,b均大于0时,求模运算和求余运算所得的c的值一致,r >= 0。a,b均小于0时,只能进行求余运算,因为求模运算除数b必须为正,r也是大于等于0。

当a和b符号不一致时,c不一样,r也不一样。

  • 求余运算结果,r不为0时, r 的符号和a一致。即余数符号和被除数符号必须相同。
  • 求模运算结果,r不为0时,r 的符号和b一致,而因为求模运算时,b必须大于0,所以r一定大于等于0,即模运算的结果一定是非负数。

我们来从java的BigInteger源码来看看实现,当b小于等于0时会出现什么情况,假设这里r = a.mod(b),那么b必须为正数,否则报异常

Exception in thread “main” java.lang.ArithmeticException: BigInteger: modulus not positive

来看mod源码:

 public BigInteger mod(BigInteger m) { // signum是此BigInteger的符号:-1表示负数,0表示零,或1表示正数。 // 请注意,BigInteger零必须具有0的符号。这对于确保每个BigInteger值只有一个表示是必要的。 if (m.signum = 0 ? result : result.add(m)); // 可以看出mod和remainder的区别就在于,mod的模必须为正,否则异常,并且取余的值小于0点话还要加上模数m }

比如 -14 ÷ 3 = -4 ・・・ -2(余数符号和被除数符号必须相同

余数就是-2,这里如果是remainder取余运算,-14 remainder 3 = -2,结果是-2

如果是mod模运算,在remainder基础上判断正负,这里-2是负数,加上模数(可认为是除法的除数),这里加上3,mod模运算结果就是1,-14 mod 3 = 1

-10 ÷ 3 = -3 ・・・ -1

余数就是-1,这里如果是remainder取余运算,-10 remainder 3 = -1,结果是-1

如果是mod模运算,在remainder基础上判断正负,这里-1是负数,加上模数(可认为是除法的除数),这里加上3,mod模运算结果就是2,-10 mod 3 = 2

7 ÷ -3 = -2 ・・・ 1

余数是1,除数是负数,这里只能取模运算remiander 7 remainder -3 = 1,结果是1。但是这里余数居然大于除数了!!!!

所以可以这么说,我们小学所学的余数一定小于除数这个结论是针对除数为正数而言。并且由前两个例子也可以看出,取模运算的值也一定小于除数,前提条件是除数为正才能取模。

如果被除数是0,不管是取模还是取余结果都是0。

0%-5=0

0mod3=0

0remainder-3=0

……

如果不是大整数,只是普通的int型,比如System.out.println(5 % -3);

打印出来是2

所以java中,%是求余运算,而不是取模运算。

另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

BigInteger类的一些使用心得

这几天做信息安全作业的rsa算法,用到了很多大数的方法。

下面总结一下以后方便找

1.给大数赋值

 BigInteger p = new BigInteger("10669721913248017310");

或者,X3是string或者int都行。

 BigInteger cx= new BigInteger("" + X3) ;  

2.把int型转化为string型

 int j=123; String X1=String.va<a style="color:transparent">来源gao($daima.com搞@代@#码(网</a>lueOf(j);

3.把两个字符串拼接

 String X1=1234; String X2=1545; String X3=X2+X1;

以上就是聊聊Java BigInteger里面的mod和remainder的区别的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:聊聊Java BigInteger里面的mod和remainder的区别

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址