嗨,我正在尝试使用自定义二进制整数除法:
资料来源:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=642

public static void DivMod (Int128 dividend, Int128 divisor, out Int128 quotient, out  Int128 remainder)
{
// Determine the sign of the results and make the operands positive.
int remainderSign = 1;
int quotientSign = 1;
if (dividend < 0)
{
    dividend = -dividend;
    remainderSign = -1;
}
if (divisor < 0)
{
    divisor = -divisor;
    quotientSign = -1;
}
quotientSign *= remainderSign;

quotient = dividend;
remainder = 0;
for (int i = 0; i < 128; i++)
{
    // Left shift Remainder:Quotient by 1
    remainder <<= 1;
    if (quotient < 0)
        remainder._lo |= 1;
    quotient <<= 1;

    if (remainder >= divisor)
    {
        remainder -= divisor;
        quotient++;
    }
}

// Adjust sign of the results.
quotient *= quotientSign;
remainder *= remainderSign;
}



但是我有两个问题:


1)我想将其用于32位整数而不是Int128。所以我假设Int128应该替换为int,并且(int i = 0; i
2)restder._lo | = 1->此行在C#中根本不起作用。我想这与他们使用的自定义128bit int结构有关,我不知道它打算做什么。有人可以帮我解决这个问题,并对其进行翻译,使其与int32兼容吗?

编辑:只是为了澄清我知道按位运算符做什么,问题部分是这样的:
剩余的我不知道此属性指的是什么,不确定此行的用途以及如何将其转换为int32?

最佳答案

要将其与32位整数(System.Int32)一起使用,可以将Int128替换为int,并将for循环中的128替换为32-因此,这是正确的。
_lo属性只是128位数字的低64位。之所以使用它,是因为.NET中最大的整数类型是64位(System.Int64)-因此,使用32位就可以忽略该属性:
remainder |= 1;


如果您遵循在问题中给出的链接,然后返回几页,您将找到Int128结构的实际实现。它从here开始。

09-09 18:34