在理论上得到模10的结果

时间:2018-04-03 20:30:33

标签: assembly bit-manipulation microcontroller bitwise-operators bit-shift

我目前正在尝试使用有限的操作在简单版本的程序集中模拟数字的模10。但是,我无法想到一个有效的方法来获得高数的模10。我当前和显而易见的"伪算法"计算模数是:

例如117mod10 = 7

只要它是正数,计算117减10,然后加10。

所以117在某个时刻我会得到-3然后我会停止用10减去而一次加10。 (我知道在这个例子中将是一个数字的错误,它实际上可被10整除)。 所以我的问题是,如果数字越大,它就会花费太长时间。因此,我想询问是否有任何方法可以通过这些可用的操作实现模10的模式:加,减,按位和按位xor,按位左移/右移?

1 个答案:

答案 0 :(得分:1)

这是一种通过将数字按位传递给结果的方法。在这样做时,我们系统地“忘记”转移高位数字。

int Modulu10(unsigned Num)
{
   while (Num > 9)
   {
     int Result = Num & 1;

     //The algorithm is quite inefficient with lower numbers, 
     //so here an isolated optimization.
     if (Num>=20) Num -= 20;  
     if (Num>=10) Num -= 10; //mandatory: No infinite loop for Num=10..15!!

     while (Num>1) //ignoring the LSB
     {
        if (Num &  2) Result +=  2;
        if (Num &  4) Result +=  4;
        if (Num &  8) Result +=  8;
        if (Num & 16) Result += 16 % 10; //becomes six
        /* Instead of the next tests
           if (Num & 32) Result +=  32 % 10; =two
           if (Num & 64) Result +=  64 % 10; =four
          we can map it in a loop: 
           The test against  32 gives the same result as the test against 2  
           The test against  64 gives the same result as the test against 4
           The test against 128 gives the same result as the test against 8  
        */
        Num >>= 4;
     }
     Num = Result; //may need again a modulu-run
   }
   return Num;
}