在没有数组或任何循环的单个校验中从用户获取5个值,并找到最大值和最小值

时间:2019-01-30 12:33:10

标签: c#

编写一个程序,该程序在不使用数组或任何循环的情况下在单个变量中获得五个值,并使用if else条件查找最大和最小数目。

1 个答案:

答案 0 :(得分:0)

您的难题可以通过移位操作来解决,以在另一个内存中存储和提取多个变量。下面是一个演示-see this blog post for an in depth explanation on what's going on。如果您对其他按位操作you can find more C++ examples here(可以轻松转换为C#)感兴趣。

enum Species
{
    Camel,
    Cat,
    Caterpillar,
    Cheetah,
    Chimpanzee,
    Cobra,
    Cormorant,
    Cougar,
    Coyote,
    Crab,
    Crocodile,
}

void AddToBitfield(ref int bitfield, int bitCount, int value)
{
    bitfield <<= bitCount;
    bitfield |= value;
}

int ReadFromBitfield(ref int bitfield, int bitCount)
{
    int value = bitfield & ((1 << bitCount) - 1);
    bitfield >>= bitCount;
    return value;
}


[Test]
public void BitwisePlayTest()
{
    bool isAlive      = true;
    bool isFiring     = false;
    bool isMale       = true;
    bool isFullHealth = false;
    Species species = Species.Chimpanzee;

    int bitfield = 0;

    AddToBitfield(ref bitfield, 1, isAlive ? 1 : 0);
    AddToBitfield(ref bitfield, 1, isFiring ? 1 : 0);
    AddToBitfield(ref bitfield, 1, isMale ? 1 : 0);
    AddToBitfield(ref bitfield, 1, isFullHealth ? 1 : 0);
    AddToBitfield(ref bitfield, 4, (int)species);

    species = (Species)ReadFromBitfield(ref bitfield, 4);
    isFullHealth = ReadFromBitfield(ref bitfield, 1) != 0;
    isMale = ReadFromBitfield(ref bitfield, 1) != 0;
    isFiring = ReadFromBitfield(ref bitfield, 1) != 0;
    isAlive = ReadFromBitfield(ref bitfield, 1) != 0;

    Assert.AreEqual(Species.Chimpanzee, species);
    Assert.AreEqual(true, isAlive);
    Assert.AreEqual(false, isFiring);
    Assert.AreEqual(false, isFullHealth);
    Assert.AreEqual(true, isMale);
}