您好我正在尝试使用自定义二进制整数除法方法: 资料来源: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 <128 ; i ++)应该是取而代之的是 i&lt; 32; 即可。正确的吗?
2)remainder._lo | = 1 - &gt;这行在C#中根本不起作用。我想它与他们使用的自定义128位int结构有关,我不知道它的意图。有人可以帮助我解决这个问题,并将其翻译成使用int32吗?
编辑:只是为了澄清我知道按位运算符的作用,问题部分是: 的 remainder._lo 即可。我不知道这个属性引用了什么,并且不确定这一行的目的,以及它将如何转换为int32?
答案 0 :(得分:0)
要将它与32位整数(System.Int32
)一起使用,你可以用int替换Int128,用for循环替换32中的128 - 所以这是正确的。
_lo
属性只是128位数的低64位。使用它是因为.NET中最大的整数类型是64位(System.Int64
) - 所以32位你可以省略属性:
remainder |= 1;
如果您按照您在问题中提供的链接并返回几页,您会发现Int128
结构的实际实现。它开始here。
答案 1 :(得分:0)
在指南的this page上对此进行了解释:
public struct Int128 : IComparable, IFormattable, IConvertible, IComparable<Int128_done>, IEquatable<Int128_done>
{
private ulong _lo;
private long _hi;
public Int128(UInt64 low, Int64 high)
{
_lo = low;
_hi = high;
}
}
您可以使用32位整数忽略它,只需执行some32int |= 1
。
他说要为每个位循环一次,所以使用32位整数,你只能循环32次。