`
445822357
  • 浏览: 738993 次
文章分类
社区版块
存档分类
最新评论

用移位和加减运算实现无符号整数除法

 
阅读更多

同样是同学遇到的面试题,面试官问的原题是如何用移位和加减实现除以3的操作,在此略微扩充一下,实现无符号整数除法,但是返回值也为无符号整型。

方法一:类似小学学习的除法运算,从高位开始减去除数,此处用除数左移到跟被除数对齐,在相减之前商也同样需要左移,代码如下。

#include <iostream>

using namespace std;

unsigned int divide(unsigned int a, unsigned int b)
{
	if(0 == b)
		__asm int 0
	unsigned int c = 1, d = 0, _b = b;
	while(a >= b)
	{
		c <<= 1;
		b <<= 1;
	}
	b >>= 1;
	c >>= 1;
	while(b >= _b)
	{
		if(a >= b)
		{
			a -= b;
			d += c;
		}
		b >>= 1;
		c >>= 1;
	}
	return d;
}

int main()
{
	unsigned int in, out;
	cin>>in;
	cin>>out;
	cout<<divide(in, out)<<endl;
	return 0;
}


方法二:用被除数减去除数,每减成功一次商的结果加1,其它代码不变,divide函数代码改为如下。

unsigned int divide(unsigned int a, unsigned int b)
{
	if(0 == b)
		__asm int 0
	unsigned int c = 0;
	while(a >= b)
	{
		a -= b;
		c++;
	}
	return c;
}


方法三:利用魔数。代码如下。

#include <iostream>

using namespace std;

int divide3(int a)
{
	return ((__int64)a * 0xAAAAAAAB) >>33;
}

int main()
{
	int in;
	cin>>in;
	cout<<divide3(in)<<endl;
	return 0;
}


其中方法三中的魔数的原理是为了用乘法实现32位被除数的除法运算,编译器会为被除数乘上一个32位的倒数,就形成了一个64位的数,其中低32位是余数,高32位为我们需要的结果,以下是一些常用的魔数,例如0xAAAAAAAB就代表2/3,0xCCCCCCCD代表4/5等等,具体可以在网上搜索相关内容。利用魔数除以5的代码如下。

#include <iostream>

using namespace std;

int divide5(int a)
{
	return ((__int64)a * 0xCCCCCCCD) >>34;
}

int main()
{
	int in;
	cin>>in;
	cout<<divide5(in)<<endl;
	return 0;
}
分享到:
评论

相关推荐

    Vivado下无符号及有符号 16_32bit 整数 乘法 除法 加法 减法 及开方的IP实现及仿真验证

    基于Vivado 2020.2下 16bit 32bit 无符号及有符号整数 乘法 除法 加法 减法 及开方的 IP核实现与仿真验证

    高精度长整数运算库 长整数除法 与 取模运算 效率 与 乘法相当

    长整数的四则运算, ...除法运算中没有用到减法与乘法,只有加法和二进制移位运算 资源中包含: bignum.h bignum.lib bignum.dll 以及一个测试的函数: test.cpp 测试时,连接所提供的动态链接库!!

    大整数乘法的实现与分析

    1 绪论 1 ...6大整数除法实现 37 6.1使用减法替换除法运算 37 6.2模拟笔算除法 38 7大整数幂运算实现 43 7.1单数位幂乘 43 7.2 K—RAY幂乘 45 7.3滑动窗口幂乘 45 结论 47 参考文献 48 致谢 49 附录 A 50

    JAVA基础之java的移位运算

    你可以利用这个特点将一个整数进行快速的2的除法。当然,你一定要确保你不会将该数原有的任何一位移出。 右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。例如,如果要移走的值为负数,每一次右移都...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    9.4.2 用短除法实现无符号长除法 174 9.5 用长除法实现双字除法 176 9.5.1 无符号双字除法 176 9.5.2 带符号双字除法 179 9.6 习题 180 第10章 除数为常量的整数除法 181 10.1 除数为2的已知次幂的带符号除法 ...

    组成原理运算方法

    组成原理运算方法 基本算术运算的实现 定点加减运算 带符号数的移位和舍入操作 定点乘法运算 定点除法运算 规格化浮点运算 十进制整数的加法运算 逻辑运算与实现 运算器的基本组成与实例

    Java2入门经典.rar

    整数除法和余数 自增和自减运算符 短整型数计算 整数算术运算中的错误 浮点运算 混合数据类型的算术运算表达式 显式类型强制转换 赋值语句中的自动类型转换 op=运算符 数学函数和常量 字符的存储 字符转义序列 字符...

    java2入门经典.part01

    整数除法和余数 自增和自减运算符 短整型数计算 整数算术运算中的错误 浮点运算 混合数据类型的算术运算表达式 显式类型强制转换 赋值语句中的自动类型转换 op=运算符 数学函数和常量 字符的存储 字符转义序列 字符...

    libdivide:libdivide的官方git仓库

    libdivide允许您通过一系列移位,替换和相乘指令来替换昂贵的整数除法指令,从而更快地计算整数除法。 在当前的CPU,你可以得到高达10倍的64位整数除法和使用libdivide当向上加速至5倍的32位整数除法的加速。 ...

    C#,最大公约数(GCD)斯坦因(Stein)算法的源代码

    Stein 的算法用算术移位、比较和减法代替除法。Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法。欧几里德算法是计算两个数...

    程序员二进制计算器 v1.36

    专为程序员打造的计算器,二进制运算强大,支持64位。 采用表达式驱动,输入表达式便即时显示结果,抛弃传统计算器繁琐的按钮,表达式可粘贴或回调重复使用。 支持二进制串直接运算,如0b1101 & 0b0011= 0b0001。 ...

    C语言代码优化 方案

    (5)避免不必要的整数除法 (6)使用增量和减量操作符 (7)使用复合赋值表达式 (8)提取公共的子表达式 4、结构体成员的布局 (1)按数据类型的长度排序 (2)把结构体填充成最长类型长度的整倍数 (3)按数据...

    IntXLib:用纯 C# 编写的任意精度整数库,快速 - 大约 O(N * log N) - 乘除算法实现

    输入法IntX 是一个用纯 C# 2.0 编写的任意精度整数库,具有快速 —— 大约 O(N * log N) —— 乘法/除法算法实现。 它提供了对整数、比较、按位移位等的所有基本算术运算。它还允许解析不同基数的数字并将它们转换为...

    javascript文档

    除法运算符 (/) 对两个表达式执行除法运算。 do...while 语句 先执行一次语句块,然后重复执行该循环,直至条件表达式的值为 false。 E 属性 返回 Euler 常数,即自然对数的底。 encodeURI 方法 将文本字符串...

    C代码优化方案1、选择合适的算法和数据结构__ 4 2、使用尽量小的数据类型__ 5

    (5)、避免不必要的整数除法__ 8 (6)、使用增量和减量操作符__ 8 (7)、使用复合赋值表达式__ 8 (8)、提取公共的子表达式__ 9 4、结构体成员的布局__ 9 (1)按数据类型的长度排序__ 10 (2)把...

    汇编指令(chm格式)

    IDIV 整数除法. 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算). AAD 除法的ASCII码调整. CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双...

    计算机科学丛书:计算机组成原理 [英] 艾伦·克莱门茨(Alan Clements)(2017.3出版)

    2.5.1 移位运算 55 2.5.2 无符号二进制乘法 56 2.5.3 快速乘法 57 2.5.4 除法 59 2.6 浮点数 63 2.6.1 IEEE浮点数 64 2.7 浮点运算 68 2.8 浮点运算和程序员 70 2.8.1 浮点运算中的误差传播 71 2.8.2 生成数学函数 ...

    在C语言编程中使用变量的基础教程

    原因在于,这是程序的本质所在,稍有研究编译器工作原理的都会发现,在编译器处理乘法乃至除法的时候,优秀的编译器总会想方设法的加快程序的速度,毫无疑问在所有运算中移位运算是最快速的”乘法”以及”除法”: ...

    C代码优化方案

    _2C代码优化方案__41、选择合适的算法和数据结构__42、使用尽量小的数据类型__53、减少运算的强度__5(1)、查表(游戏程序员必修课)_5(2)、求余运算__6(3)、平方运算__6(4)、用移位实现乘除法运算__6(5)、...

Global site tag (gtag.js) - Google Analytics