




Это называется логическим. По крайней мере, он будет выполнять основную функцию, не так ли? Вы не так часто вертите биты в C# (по крайней мере, я этого не делаю), и если вам нужно, вы можете использовать встроенные операции.
Логические значения обычно имеют размер не один бит.
Правда, их размер определяется реализацией. Это не значит, что он не может служить той же цели.
@JasperBekkers Ну, вы все равно не можете обрабатывать отдельные биты в памяти. Есть проблемы с выравниванием и заполнением памяти. Конечно, если у вас много битов, вы можете их эффективно представить, но для этого предназначен BitArray.
@Luaan Вы правы, что большая часть оборудования не загружает / не хранит отдельные биты, как это, но вы все равно можете иметь информацию, представленную одним битом. Или соберите много кусочков вместе. И хотя логические значения представляют только один бит информации, их физический размер - нет.
@JasperBekkers: Но вы не можете индивидуально адресовать отдельные биты в памяти, но именно поэтому проблема с пространством недействительна.
@EdS. Конечно, вы не можете, но если у вас их несколько, пробел / делает / учитывает :) Редко какая-либо проблема имеет размер 1.
@JasperBekkers: Конечно. Я ответил на этот вопрос довольно давно, когда только начинал экспериментировать с C#. Я бы сегодня так не ответил.
Есть является класс BitArray ..
Если у вас есть набор битовых флагов, то использование перечислений (с атрибутом flags) и целых чисел работает долгое время.
Что бы вы хотели с этим делать? Имейте в виду, что CLR не собирается пытаться упаковать несколько переменных в байт, поэтому наличие одной отдельной будет не более полезным, чем логическое значение. Если вы хотите иметь их коллекцию - ну, для этого и нужен BitArray, как указал Дэвид.
Если у нас сделал есть структура Bit, я подозреваю, что люди будут ожидать, что несколько переменных Bit будут эффективно упакованы в памяти - не имея типа в первую очередь, мы избегаем этого ожидания и подталкиваем людей к другим решениям, таким как BitArray.
Хотя, возможно, есть редкие исключения, компьютеры не предназначены и не предназначены для манипулирования или распределения отдельных битов. Даже на самых низких уровнях (ассемблер или чистый машинный язык) вы не сможете выделить или получить доступ к отдельному биту. В этом отношении у вас есть те же инструменты, что и на любом уровне программирования: байты и побитовые операции.
Наряду с уже упомянутым классом BitArray существует также более эффективный Структура BitVector32.
BitVector32 is more efficient than BitArray for Boolean values and small integers that are used internally. A BitArray can grow indefinitely as needed, but it has the memory and performance overhead that a class instance requires. In contrast, a BitVector32 uses only 32 bits.
Имейте в виду, что вы ограничены 32 значениями.
Что стоит, вот полноценная битовая структура, полная с приведениями 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
}
Это не использует 1 бит памяти, он использует 4 байта, потому что все, что вы делаете, это обертывает int.
Я никогда не утверждал, что это использует 1 бит памяти. Это просто представляет 1 бит. Я до сих пор не понимаю голосов против.
Я прочитал вопрос как подразумевающий, почему он не встроен изначально. Возможно, поэтому некоторые голосуют против?
Ответ заключается в том, что биты никогда не встречаются изолированно, и поддерживать именованные битовые индексы очень неэффективно. Биты всегда будут содержаться в числовых примитивах, где у вас будет полный доступ к отдельным битам и полному набору побитовых операторов.
@ RickO'Shea 1) Биты делать появляются изолированно в некоторых контекстах, например, при представлении отдельных флагов микропроцессора в эмуляторах. 2) Я только что разместил полезный для меня класс в надежде, что он может быть полезен кому-то еще, вам решать, соответствует ли он вашим потребностям (с точки зрения эффективности и / или по другому) или нет.
Вы можете сделать это сейчас в C# 7.0!
public const int One = 0b0001;
Сейчас это поддерживается в C# 7.0 .... хотя спустя 11 лет :) Я добавил ответ ниже.