Наиболее распространенные битовые операции C# на перечислениях

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
197
задан Drew Noakes 28 October 2012 в 07:33
поделиться

5 ответов

я сделал еще некоторую работу над этими расширениями - можно найти код здесь

, я записал некоторые дополнительные методы, которые расширяют Систему. Перечисление, которое я часто использую... Я не утверждаю, что они являются пуленепробиваемыми, но они помогли... Комментарии удалены...

namespace Enum.Extensions {

    public static class EnumerationExtensions {

        public static bool Has<T>(this System.Enum type, T value) {
            try {
                return (((int)(object)type & (int)(object)value) == (int)(object)value);
            } 
            catch {
                return false;
            }
        }

        public static bool Is<T>(this System.Enum type, T value) {
            try {
                return (int)(object)type == (int)(object)value;
            }
            catch {
                return false;
            }    
        }


        public static T Add<T>(this System.Enum type, T value) {
            try {
                return (T)(object)(((int)(object)type | (int)(object)value));
            }
            catch(Exception ex) {
                throw new ArgumentException(
                    string.Format(
                        "Could not append value from enumerated type '{0}'.",
                        typeof(T).Name
                        ), ex);
            }    
        }


        public static T Remove<T>(this System.Enum type, T value) {
            try {
                return (T)(object)(((int)(object)type & ~(int)(object)value));
            }
            catch (Exception ex) {
                throw new ArgumentException(
                    string.Format(
                        "Could not remove value from enumerated type '{0}'.",
                        typeof(T).Name
                        ), ex);
            }  
        }

    }
}

Тогда они используются как следующий

SomeType value = SomeType.Grapes;
bool isGrapes = value.Is(SomeType.Grapes); //true
bool hasGrapes = value.Has(SomeType.Grapes); //true

value = value.Add(SomeType.Oranges);
value = value.Add(SomeType.Apples);
value = value.Remove(SomeType.Grapes);

bool hasOranges = value.Has(SomeType.Oranges); //true
bool isApples = value.Is(SomeType.Apples); //false
bool hasGrapes = value.Has(SomeType.Grapes); //false
285
ответ дан skybluecodeflier 23 November 2019 в 05:13
поделиться

Идиома должна использовать поразрядное или - равный оператор для установки битов:

flags |= 0x04;

Для очистки немного идиома должна использовать поразрядно и с отрицанием:

flags &= ~0x04;

Иногда у Вас есть смещение, которое определяет Ваш бит, и затем идиома должна использовать, они объединились со сдвигом влево:

flags |= 1 << offset;
flags &= ~(1 << offset);
88
ответ дан Stephen Deken 23 November 2019 в 05:13
поделиться

Синтаксис C++, принимая бит 0 является LSB, принятие отмечает, не подписано долго:

Проверка, если Установлено:

flags & (1UL << (bit to test# - 1))

Проверка, если не набор:

invert test !(flag & (...))

Набор:

flag |= (1UL << (bit to set# - 1))

Ясный:

flag &= ~(1UL << (bit to clear# - 1))

Переключатель:

flag ^= (1UL << (bit to set# - 1))
7
ответ дан Petesh 23 November 2019 в 05:13
поделиться

Для тестирования немного, Вы сделали бы следующее: (принимающие флаги являются числом на 32 бита)

, Тест Укусил:

if((flags & 0x08) == 0x08)
(Если бит 4 установлен тогда его истинное), Переключатель Назад (1 - 0 или 0 - 1):
flags = flags ^ 0x08;
Обнуленный Бит 4:
flags = flags & 0xFFFFFF7F;
3
ответ дан Andy Johnson 23 November 2019 в 05:13
поделиться

Операции C++: & | ^ ~ (для и, или, xor и не битовые операции). Также интереса>> и < < которые являются операциями сдвига разряда.

Так, для тестирования некоторое время быть установленным во флаге Вы использовали бы: если (отмечает & 8)//тесты укусили 4, был установлен

0
ответ дан workmad3 23 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: