如何操作整数值的特定数字?

时间:2017-09-25 14:15:48

标签: c# integer bit-manipulation decimal digit

我必须创建一个控件,可以操纵整数值的每个“数字”(从0999,999)。

我知道如何“获取”整数的数字 - 只是Mod / Div -

public class IntegerModel{
    private int _value = 0;
    private int _GetValue( int baseValue, int modBy, int divBy ) => 
        ( baseValue % modBy ) / divBy;

    public int Value => _this.Value;

    public One => {
        get => this._GetValue( this.Value, 10, 1 );
        set => Console.WriteLine( "What do I put here?" );
    }

    public Ten{
        get => this._GetValue( this.Value, 100, 10 );
        set => Console.WriteLine( "What do I put here?" );
    }
}

问题在于我不知道如何雄辩地设定数字值。

如果我在Binary中工作,那就像使用一些按位运算符一样简单(它可能仍然存在,但我不知道该怎么做)。

所以,理想情况下,如果我使用这个类,执行以下操作,我会得到给定的输出。

IntegerModel Foo = new IntegerModel( );
Foo.One = 7;
Foo.Ten = 3;
Console.WriteLine( Foo.Value ); //Output should be 37

我需要在OneTen属性设置器中放置什么才能实现所需的行为?

2 个答案:

答案 0 :(得分:3)

我建议setget使用模块化算法;另一个建议是实现 indexer 以访问整数的第n位。

  public class IntegerModel {
    private int _value = 0;

    private static int Power10(int value) {
      return (int) Math.Pow(10, value);
    }

    public int Value {
      get {
        return _value;
      }
    }

    //TODO: Implement ToString, Equals etc.

    public int this[int index] {
      get {
        if (index < 0 || index > 6)
          throw new ArgumentOutOfRangeException("index");

        return (_value / Power10(index)) % 10;  
      }
      set {
        if (index < 0 || index > 6)
          throw new ArgumentOutOfRangeException("index");
        else if (value < 0 || value > 9)
          throw new ArgumentOutOfRangeException("value");

        _value = (index / Power10(index + 1)) * Power10(index + 1) + 
                  value * Power10(index) +
                 _value % Power10(index);
      }
    }
  }

如果您坚持使用OneTen等属性,则可以轻松添加它们:

  public int One {
    get {return this[0];}    // 0th digit
    set {this[0] = value;}   // 0th digit
  }

  public int Ten {
    get {return this[1];}    // 1st digit
    set {this[1] = value;}   // 1st digit
  }

  public int Hundred {
    get {return this[2];}    // 2nd digit
    set {this[2] = value;}   // 2nd digit 
  }

测试:

  IntegerModel test = new IntegerModel();

  // 987:
  test[0] = 7; // Last   (0th digit from the end)
  test[1] = 8; // Middle (1st digit from the end)
  test[2] = 9; // First  (2nd digit from the end)

  // 987
  Console.WriteLine(test.Value);

答案 1 :(得分:0)

1将您的整体价值分为三个部分 - 高,低,相关数字。丢弃相关数字......我刚刚提到它以表明&#34;高&#34;之间的差距。和&#34;低&#34;

2为了得到嗨,除以(10 ^位+ 1)之类的东西,然后乘以10 ^(位置+ 1)

3将相关数字乘以(10 ^位置)

4将其添加到低(低现在应该长一个数字)

5从高到低添加以获得最终答案

我的数学很糟糕,所以期待很多。我很确定逻辑是合理的。