/*
计算int a 除以 2的b次方 b为unsigned
例如(-285/8) 要求不使用除法,要求高效率 (即使用移位操作 ) |
*/
/* VC 6.0 jernymy */
#include <stdio.h>
#define MOVE_BIT (sizeof(int) * 8 - 1) // 32bit is 31, 16bit is 15
#define TIVE_V(a) (a) = (~(a) + 1)
// Remainder
// Divisor
void GetDivRmd(int nVar, int nBit, int *pnDiv, int *pnRmd)
{
int nPos = ((nVar >> MOVE_BIT) & 0x1); // Positive number or Negative number
int nCount = 0;
while (nBit > 1)
{
// get 2 bit number
nCount++;
nBit >>= 1;
}
if (nPos) // Negative number
{
TIVE_V(nVar); // get abs var, is Positive number
}
*pnDiv = nVar >> (nCount);
*pnRmd = nVar - (*pnDiv << nCount);
if (nPos)
{
TIVE_V(*pnDiv); // set Negative number
TIVE_V(*pnRmd); // set Negative number
}
}
int main(void)
{
int nDiv;
int nRmd;
GetDivRmd(285, 8, &nDiv, &nRmd);
printf("285/8 = %d(%d)\n", nDiv, nRmd);
GetDivRmd(-285, 8, &nDiv, &nRmd);
printf("-285/8 = %d(%d)\n", nDiv, nRmd);
return 0;
}
// 写的有点复杂,待优化