`
sing100star
  • 浏览: 29006 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

取模、除法的实现

阅读更多

如何优化除法和取模,一般来说有下的解决方案

对于除数为 2 n 次方的,可以采用位逻辑运算符的形式

比如 22/16 可以等价为 22>>4,;22%4 可以等价位 22-(22>>4<<4);

但如果是不其他数,比如 2344/3,45/3 ,那么该怎么办?

 

是否可以这样这样想,除法可以转换成减法,比如 12/3 等以认为是 12-3-3 -3-3=0;

用代码可以这样表示

            

//假设 a/b =c-----d
 c=0;
While(a>=b)
{
    a-=b;
    c++;
}
return c;
 

 

  结合 12/3 来具体分析一下,

              第一次循环 a=9;c=1;

              第二次循环 a=6;c=2;

              第三次循环 a=3;c=3;

              第四次循环 a=0;c=4;

              第五次循环 终止

通过这个方法是可以实现我们的要求的

  但是对于含有负数的情况怎么办?首先我举几个例子

              11 / 3 = 3;

            -11 / -3 = 3;

            -11 / 3 = -3;

              11/-3 = -3

由此可以发现,我们得出以下结论

              / =

              / =

              / =

              / =

因此可以把 2-4 种情况,转化为第一种情况,在对结果进行转化

此外应该注意某些非法的输入,比如除数为零,数值过大等等

那取模怎么办, 事实上,它跟除法差不多,他的核心代码如下

While(a>=b)
{
   a-=b;
}
Return a;
 

不同的是,他返回时 a

当然取模也有四种情况:

/ =

              / =

              / =

              / =

同样的道理,也可以把 2-4 种情况,转化为第一种情况,在对结果进行转化。

 

最后代码如下

public class Operation
{
	/** 关于整数的除法运算
	  *
	  */
	public static int div(int a,int b)
	{	
		//还有一些可能的异常,没有写出来
		//如果被除数为0
		if(b ==0) throw new ArithmeticException("除数不能为零");
		
		//如果a正,b正
		if(a>=0 && b>= 0)  		
			return division(a,b);
		//如果a负,b负
		else if(a<0 && b <0)
			return division(-a,-b);
		//如果a正,b负
		else if(a >= 0 && b < 0)
			return -division(a,-b);
		//如果a负,b正
		else return -division(-a,b); 
	}
	private  static int division(int a,int b) 
	{
		int count = 0;
		while(a >= b)
		{
			a-=b;
			count++;
		}
		return count;
	}
	 /** 关于整数的取模运算
	  *
	  */
	public static int mod(int a,int b)
	{	
		//还有一些可能的异常,没有写出来
		//如果被除数为0
		if(b ==0) throw new ArithmeticException("除数不能为零");
	
		//如果a正,b正
		if(a>=0 && b> 0)  		
			return modulo(a,b);
		//如果a负,b负
		else if(a<0 && b <0)
			return -modulo(-a,-b);
		//如果a正,b负
		else if(a >= 0 && b < 0)
			return modulo(a,-b);
		//如果a负,b正
		else return -modulo(-a,b); 
	}
	private  static int modulo(int a,int b) 
	{
		int count = 0;
		while(a >= b)
		{
			a-=b;
		}
		return a;
	} 
	
	public static void main(String[] args) throws Exception
	{	
		System.out.println(Operation.div(11,3));
		System.out.println(Operation.div(-11,-3));
		System.out.println(Operation.div(-11,3));	
		System.out.println(Operation.div(11,-3));
	
		System.out.println(Operation.mod(11,3));
		System.out.println(Operation.mod(-11,-3));
		System.out.println(Operation.mod(-11,3));	
		System.out.println(Operation.mod(11,-3));
	}
}
 

 

0
0
分享到:
评论

相关推荐

    发一个用cordic算法实现取模运算的verilog代码

    在数字电路设计中,取模运算对于各种应用如计数器、除法器以及密码学等都是至关重要的。Cordic算法通过迭代方式,逐次调整输入向量,直到达到期望的目标值,这使得它在资源有限的FPGA或ASIC设计中特别有用。 Cordic...

    2.带余除法的c语言程序

    在模运算中,我们通常对一个数进行除法后取模,以获取该数在模意义下的等价类。例如,7 mod 3 = 1,意味着7在模3的情况下与1相同。模运算在密码学、数据编码和计算机算法设计中都有重要应用。 总之,带余除法是...

    带符号整数的除法与余数

    在C++语言中,情况与C语言类似,但在早期标准(如C++03)中,对于除法和取模运算中余数的正负号没有明确规定。不过,C++11标准则明确余数应该是非负的,当两个操作数同为非负时。然而,对于C++的早期标准,仍存在对...

    CPU 设计 (加法器、乘法器、除法器等,ppt文件)

    除法器在CPU中主要用于执行除法和取模操作,对于浮点运算和数学函数的计算尤为重要。 FPGA设计是电子工程和计算机科学的一个分支,允许开发者根据需求定制硬件。与ASIC(应用特定集成电路)相比,FPGA具有更高的...

    整数乘除法练习器

    此外,还有取模运算符`%`,用于获取除法的余数,可用于判断是否为整除。 四、控制流程 为了让用户能够多次进行计算,我们需要循环结构。可以使用`while`、`for`等循环语句。例如,用`while`实现一个简单的循环: `...

    CRC16校验模二除法计算器

    模二除法是实现CRC校验的基础算法,它不同于我们平常所学的十进制除法,因为在这个系统中,除数和被除数都是二进制数,并且遵循模二运算规则,即两个数相加如果结果超过1,则结果为结果对2取模。 CRC16校验指的是...

    大数的除法

    本篇文章将深入探讨如何实现大数的除法运算,这在密码学、分布式计算、科学计算等领域都有着广泛应用。 大数除法的核心是模拟传统的长除法过程,但我们需要将其扩展到可以处理任意长度的数字。这个过程涉及的主要...

    易语言除法模块

    这些函数可能包括整数除法函数(如`整数除法`)、浮点除法函数(如`浮点除法`)以及模除法函数(如`取模`)。通过分析源码,我们可以学习到如何在易语言中定义和调用这些函数,以及如何处理可能出现的除零错误。 在...

    verilog实现除法操作代码及仿真

    本主题将深入讲解如何使用Verilog实现除法操作,并结合FPGA进行仿真验证。 首先,让我们理解除法的基本原理。除法可以视为乘法的逆运算,通常通过连续的减法和移位来实现。在二进制系统中,这个过程与十进制系统...

    D.rar_c++大数除法

    通过以上步骤,我们可以实现C++中的大数除法,处理100位数的除法并保留100位小数。这不仅涉及到数据结构的设计,还包括了数值计算的精确性和效率问题。在实际编码时,还需要考虑代码的可读性和可维护性,确保算法的...

    《统计计算》模拟式除法的c 语言实现

    在C语言中,模拟式除法是一种用于...模拟式除法利用整数溢出来处理计算,而素数模乘同余法则通过乘法和减法实现随机数的生成。这两种方法都在处理数值计算时,巧妙地解决了可能的溢出问题,确保了计算的准确性和效率。

    数据结构课程设计-大数运算-实现大数加法、大数减法、大数乘法、大数除法、大数乘方、大数取模、同时支持十进制大数和二进制大数运算

    大数运算主要包括加法、减法、乘法、除法、乘方和取模等基本操作。这些操作在实现上需要特别考虑,因为它们不能直接通过内置的数据类型来处理。以下是对每个运算的详细说明: 1. **大数加法**:大数加法与小学数学...

    实验1 原码除法器设计1

    在设计过程中,禁止直接使用Verilog中的除法和取模运算符,而是要利用恢复余数算法或加减交替算法来实现。 **原码除法原理**: 原码除法中,符号位是独立处理的。假设被除数为[x]原,除数为[y]原,它们的绝对值分别...

    ARM的除法运算优化策略

    在嵌入式软件编程中,优化除法运算对于提高处理器效率至关重要,特别是在使用ARM架构的设备上,因为ARM硬件不直接支持除法指令。...在实际编程中,开发者应结合具体应用场景,灵活运用这些方法,实现高效的除法运算。

    算法-带余除法(信息学奥赛一本通-T1009)(包含源程序).rar

    2. **排序与查找**:在计算数组中元素的相对位置或者确定特定元素出现的位置时,带余除法可以简化计算,如取模分桶、线性探测法解决哈希冲突等。 3. **动态规划**:在动态规划问题中,状态转移方程常常涉及带余除法...

    大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制运算.zip

    大数运算处理的是超出普通整型数据类型范围的数值,通常涉及的运算包括加法、减法、乘法、除法、取模以及幂运算和模幂运算。在给定的"大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制...

    用P1、P0口显示除法运算结果.zip

    这可能涉及到C语言的算术运算符,如"/"表示除法,以及可能的取模运算符 "%",用于获取除法后的余数。同时,这个过程可能涉及到位操作,因为P1和P0口通常是按位进行操作的。 标签“资料”表明这是一个教学或者学习...

    除法m除以n保留小数点后k位 c语言代码 包含实验报告

    在这个实验中,我们主要学习了C语言的除法运算、浮点数处理、取模运算以及自定义四舍五入的方法。这些都是C语言基础的重要组成部分,对于理解和编写涉及数值计算的程序至关重要。通过这样的实践,可以加深对这些概念...

    in_hash.rar_hash取模

    取模法构造散列函数时,通常是将输入数据经过某种计算(如除法、位操作等)后,用模运算限制其结果在0到(表大小-1)之间。这样,每个输入数据都将对应一个唯一的桶(bucket),数据存储在这个桶对应的数组位置上。...

Global site tag (gtag.js) - Google Analytics