Почему я не могу определить немного в C #? - PullRequest
8 голосов
/ 09 декабря 2008

Почему в C # нет структуры битов?

Ответы [ 8 ]

19 голосов
/ 05 сентября 2014

Для чего стоит, вот полноценная битовая структура, дополненная int и bool приведением и арифметическими операциями. Наверное, не идеально, но у меня отлично работает. Наслаждайтесь!

/// <summary>
/// Represents a single bit that can be implicitly cast to/from and compared
/// with booleans and integers.
/// </summary>
/// <remarks>
/// <para>
/// An instance with a value of one is equal to any non-zero integer and is true,
/// an instance with a value of zero is equal to the integer zero and is false.
/// </para>
/// <para>
/// Arithmetic and logical AND, OR and NOT, as well as arithmetic XOR, are supported.
/// </para>
/// </remarks>
public struct Bit
{
    /// <summary>
    /// Creates a new instance with the specified value.
    /// </summary>
    /// <param name="value"></param>
    public Bit(int value) : this()
    {
        Value = value == 0 ? 0 : 1;
    }

    /// <summary>
    /// Gets the value of the bit, 0 or 1.
    /// </summary>
    public int Value { get; private set; }

    #region Implicit conversions

    public static implicit operator Bit(int value)
    {
        return new Bit(value);
    }

    public static implicit operator int(Bit value)
    {
        return value.Value;
    }

    public static implicit operator bool(Bit value)
    {
        return value.Value == 1;
    }

    public static implicit operator Bit(bool value)
    {
        return new Bit(value ? 1 : 0);
    }

    #endregion

    #region Arithmetic operators

    public static Bit operator |(Bit value1, Bit value2)
    {
        return value1.Value | value2.Value;
    }

    public static Bit operator &(Bit value1, Bit value2)
    {
        return value1.Value & value2.Value;
    }

    public static Bit operator ^(Bit value1, Bit value2)
    {
        return value1.Value ^ value2.Value;
    }

    public static Bit operator ~(Bit value)
    {
        return new Bit(value.Value ^ 1);
    }

    public static Bit operator !(Bit value)
    {
        return ~value;
    }

    #endregion

    #region The true and false operators

    public static bool operator true(Bit value)
    {
        return value.Value == 1;
    }

    public static bool operator false(Bit value)
    {
        return value.Value == 0;
    }

    #endregion

    #region Comparison operators

    public static bool operator ==(Bit bitValue, int intValue)
    {
        return 
          (bitValue.Value == 0 && intValue == 0) || 
          (bitValue.Value == 1 && intValue != 0);
    }

    public static bool operator !=(Bit bitValue, int intValue)
    {
        return !(bitValue == intValue);
    }

    public override bool Equals(object obj)
    {
        if(obj is int)
            return this == (int)obj;
        else
            return base.Equals(obj);
    }

    #endregion
}
16 голосов
/ 09 декабря 2008

Это называется логическим. По крайней мере, это будет служить основной функции, верно? Вы не переключаете биты, которые часто используются в C # (по крайней мере, я этого не делаю), и, если вам нужно, вы можете использовать встроенные операции.

15 голосов
/ 09 декабря 2008

Там есть a BitArray class ..

9 голосов
/ 09 декабря 2008

Что бы вы хотели с этим сделать? Имейте в виду, что CLR не будет пытаться упаковать несколько переменных в байт, поэтому наличие одной из них будет не более полезным, чем логическое значение. Если вы хотите иметь их коллекцию - ну, для этого и нужен BitArray , как указал Дэвид.

Если бы у нас была структура битов, я подозреваю, что люди ожидали бы, что несколько битовых переменных будут эффективно упаковываться в память - из-за отсутствия типа во-первых, мы избегаем этого ожидания и приводим людей к другие решения, такие как BitArray.

3 голосов
/ 09 декабря 2008

Если у вас есть коллекция битовых флагов, то использование enums (с атрибутом falgs) и целых чисел работает очень долго.

2 голосов
/ 20 февраля 2013

Наряду с уже упомянутым классом BitArray существует и более эффективная Структура BitVector32 .

BitVector32 более эффективен, чем BitArray для логических значений и маленькие целые числа, которые используются внутри. BitArray может расти по мере необходимости, но затрачивает память и производительность что требует экземпляр класса. В отличие от BitVector32 использует только 32 бита.

Имейте в виду, что вы ограничены 32 значениями.

Примеры использования BitVector32 на Dotnetpearls.com

2 голосов
/ 12 мая 2012

Хотя, возможно, существуют редкие исключения, компьютеры не предназначены или не предназначены для манипулирования или распределения отдельных битов. Даже на самых низких уровнях (ассемблер или чистый машинный язык) вы не сможете выделить или получить доступ к отдельному биту. В этом отношении у вас есть те же инструменты, что и на любом уровне программирования: байты и побитовые операции.

1 голос
/ 27 января 2019

Вы можете сделать это сейчас в C # 7.0!

public const int One = 0b0001;

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#numeric-literal-syntax-improvements

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...