繁体   English   中英

c# 增加 2 个数字直到最大值

[英]c# increase 2 number untill max value

所以我有 2 个numbers

4 bit - Allowed range is 0-15
12 bit - Allowed range is 0-4095

我想创建function获得 2 个numbers并增加这 2 个numbers ,首先是 12 bit数字,然后在此数字达到最大值后将其设置为零并增加第二个number

例如:

for 1 and 2 - 1, 3
for 1 and 4094 - 1, 4095
for 1 and 4095 - 2, 0
for 15 and 4095 - 0, 0

这是我的解决方案:

public static Tuple<int, int> IncreaseSequenceControl(int firstNumber, int secondNumber)
{
    if (firstNumber < 15)
    {
        if (secondNumber < 4095)
        {
            secondNumber += 1;
            return Tuple.Create<int, int>(firstNumber, secondNumber);
        }
        else
        {
             firstNumber += 1;
             secondNumber = 0;
             return Tuple.Create<int, int>(firstNumber, secondNumber);
         }
    }
    else
    {
         firstNumber = 0;
         return Tuple.Create<int, int>(firstNumber, secondNumber);
    }
}

任何其他或更优雅的解决方案,或者这很好?

这可以通过多种方式完成,这是一个单行:

public static (int, int) IncreaseSequenceControl(int firstNumber, int secondNumber) => (
     (firstNumber + Math.DivRem(secondNumber + 1, 4096, out int remainder)) 
         is <= 15 and var result 
         ? result 
         : 0, 
     remainder
);

为了使这一点更清楚,我将编写上述解决方案的更具可读性的版本:

// First number is the 4 bit number
// Second number is the 12 bit number
public static (int, int) IncreaseSequenceControl(int firstNumber, int secondNumber)
{
    int quotient = Math.DivRem(secondNumber + 1, 4096, out int remainder);
    // The quotient represents how many times the 4095 limit has been hit.
    // If the quotient is 0, the secondNumber is less than 4096.
    // The remainder will contain the value left after incrementing the firstNumber as many times as the value of the quotient, so remainder can be assigned to second number

    // Increment firstNumber as many times as the 4096 limit was hit
    int result = firstNumber + quotient;
    if (result <= 15)
    {
         firstNumber = result;
    }
    else
    {
        // If result is greater than 15, set to 0
        firstNumber = 0;
    }
    // The leftover value after the quotient
    secondNumber = remainder;
    return (firstNumber, secondNumber);
}

Math.DivRem() function 接受被除数和除数并返回商。 function 还接受一个out参数,通过该参数将返回余数。

此外,您可能已经注意到我将(int, int)作为返回类型。 这是System.ValueTuple<int, int>的简写方式/语法糖。 建议使用ValueTuple而不是使用Tuple 首先,因为他们提供了这种语法糖。 其次,通过Tuple class 将元组实现为引用类型被认为是一个“错误”,已通过ValueTuple

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM