سلام.
به شکل باینری تقسیم رو انجام بدید فقط کافیه یک حلقه ی حداکثر 96 تایی به ازای هر بیت طی کنید. در یک چشم به هم زدن جواب رو بدست میاره. خیییییلیییییی سریع تر از روشی که گفتید.
int Int64_Log2(const __int64 i)
{
int result = 63;
while ((i & (1UI64 << result)) == 0UI64)
result--;
return result;
};
__int64 Divide(
const __int64 i1,
const __int64 i2,
__int64 * p_remainder = NULL)
{
#define _0_ 0I64
#define _1_ 1I64
__int64 ui64, ui64Sub, Maqsum, MaqsumElaih;
int i;
if (i2 == _0_)
{
//ShowMessage('Error');
return 0xffffffffffffffffUI64;
};
if ( i1 == _0_ )
{
return _0_ ;
};
ui64 = _0_ ;
Maqsum = abs(i1);
MaqsumElaih = abs(i2);
i = Int64_Log2(Maqsum) - Int64_Log2(MaqsumElaih);
while ( i >= 0 )
{
ui64Sub = Maqsum - (MaqsumElaih << i);
if ( ui64Sub >= _0_ )
{
ui64 |= (_1_ << i);
Maqsum = ui64Sub;
};
i--;
};
if (p_remainder != NULL)
p_remainder[0] = Maqsum;
if (( i1 < _0_ ) != ( i2 < _0_ ))
return -ui64;
else
return ui64;
};
این یک مثال برای یک عدد 64 بیتی هست که جمع و تفریق و شیفت رو لازم نیست تابعی براش تعریف کنیم. البته تقسیم دو عدد 64 بیتی اصلا کلا نیازی به این تابع نداره کافیه از / استفاده کنیم ولی من برای تست روشم این کارو انجام دادم.
به حلقه ی داخل تابع دقت کنید. قسمت مهمش همونجاست. تابع Int64_Log2 تعریف کردم تا اولین بیتی که 1 هست از سمت چپ برام پیدا کنه. (یعنی تعداد ارقام عدد تو سیستم دودویی، منهای یک).
وقتی مقسوم علیه رو شیفت میدیم به سمت چپ به تعداد n تا، به این معنی هست که بیت n ام ضربدر مقسوم علیه. یادتونه تو ضرب ده دهی هر چی رقما اضافه میشد یک صفر اضافه میکردیم تو خط بعدی. اینجا همون شیفته. برای اینکه چک کنیم که اگر بیت n ام جواب، یک باشه و ضرب بشه تو مقسوم علیه، از مقسوم بزرگتر میشه یا نه. برای اینکه هر بار ضرب نکنیم کافیه مقدار اضافی هر مرحله رو کم کنیم.
برای 96 بیتی هم به همین روش میتونید عمل کنید با همون بیت ست فقط تابع تفریق لازم دارید که تعریف کنید.