引用: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;
}