整数除法还有这么一手,学习!

引用:http://www.xuebuyuan.com/521526.html

要求:如何用移位和加减实现除以3的操作,在此略微扩充一下,实现无符号整数除法,但是返回值也为无符号整型。

利用魔数。代码如下。

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章