Почему я не могу определить бит в C#?

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

Сейчас это поддерживается в C# 7.0 .... хотя спустя 11 лет :) Я добавил ответ ниже.

LeWoody 27.01.2019 05:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
1
41 246
8

Ответы 8

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

Логические значения обычно имеют размер не один бит.

Jasper Bekkers 09.12.2008 12:41

Правда, их размер определяется реализацией. Это не значит, что он не может служить той же цели.

Ed S. 27.12.2008 03:25

@JasperBekkers Ну, вы все равно не можете обрабатывать отдельные биты в памяти. Есть проблемы с выравниванием и заполнением памяти. Конечно, если у вас много битов, вы можете их эффективно представить, но для этого предназначен BitArray.

Luaan 05.09.2014 15:08

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

Jasper Bekkers 05.09.2014 21:11

@JasperBekkers: Но вы не можете индивидуально адресовать отдельные биты в памяти, но именно поэтому проблема с пространством недействительна.

Ed S. 05.09.2014 21:22

@EdS. Конечно, вы не можете, но если у вас их несколько, пробел / делает / учитывает :) Редко какая-либо проблема имеет размер 1.

Jasper Bekkers 12.09.2014 23:13

@JasperBekkers: Конечно. Я ответил на этот вопрос довольно давно, когда только начинал экспериментировать с C#. Я бы сегодня так не ответил.

Ed S. 12.09.2014 23:25

Есть является класс 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 значениями.

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

Что стоит, вот полноценная битовая структура, полная с приведениями 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.

Krythic 02.04.2016 03:45

Я никогда не утверждал, что это использует 1 бит памяти. Это просто представляет 1 бит. Я до сих пор не понимаю голосов против.

Konamiman 03.04.2016 00:48

Я прочитал вопрос как подразумевающий, почему он не встроен изначально. Возможно, поэтому некоторые голосуют против?

pwilcox 26.02.2019 23:03

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

Rick O'Shea 01.03.2021 04:35

@ RickO'Shea 1) Биты делать появляются изолированно в некоторых контекстах, например, при представлении отдельных флагов микропроцессора в эмуляторах. 2) Я только что разместил полезный для меня класс в надежде, что он может быть полезен кому-то еще, вам решать, соответствует ли он вашим потребностям (с точки зрения эффективности и / или по другому) или нет.

Konamiman 01.03.2021 13:59

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

public const int One = 0b0001;

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

Другие вопросы по теме