exponenta event banner

Использовать битовые флаги с перечислениями .NET

Как MATLAB поддерживает побитовые операции на System.Enum

Многие языки .NET поддерживают побитовые операции над перечислениями, определенными с помощью System.Flags атрибут. Язык MATLAB ® не имеет эквивалентных операций и поэтому предоставляет методы экземпляра для выполнения побитовых операций над объектом перечисления. Побитовые методы: bitand, bitnot, bitor, и bitxor.

Перечисление может определять флаг бита. Битовый флаг позволяет создавать экземпляры перечисления для хранения комбинаций значений, определенных членами. Например, файлы и папки имеют такие атрибуты, как Archive, Hidden, и ReadOnly. Для данного файла выполните операцию на основе одного или нескольких из этих атрибутов. С помощью побитовых операторов можно создавать и тестировать комбинации.

Для использования побитовых операторов перечисление должно иметь:

  • Flags атрибут. В версии 4 платформы эти перечисления также имеют HasFlag способ.

  • Значения, соответствующие степеням 2.

Создание флагов битов перечисления .NET

Используйте пример MATLAB, NetDocEnum.MyDays перечисление в следующих примерах.

Предположим, что у вас есть следующие запланированные операции:

  • Понедельник - Заседание Департамента в 10:00

  • Среда и пятница - заседание группы в 2:00

  • Четверг - Волейбольный мяч ночь

Можно комбинировать элементы MyDays для создания переменных MATLAB с помощью bitor метод, который объединяет два элемента. Например, для создания переменной teamMtgs дней собраний группы, тип:

teamMtgs = bitor(...
    NetDocEnum.MyDays.Friday,...
    NetDocEnum.MyDays.Wednesday);

Создание переменной allMtgs всех дней с собраниями:

allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);

Чтобы узнать, какие дни принадлежат каждой переменной, введите:

teamMtgs
allMtgs
teamMtgs = 
Wednesday, Friday

allMtgs = 
Monday, Wednesday, Friday

Удаление флага из переменной

Предположим, что ваш менеджер отменяет встречу в среду на этой неделе. Удалить Wednesday от allMtgs переменная, используйте bitxor способ.

thisWeekMtgs = bitxor(allMtgs,NetDocEnum.MyDays.Wednesday)
thisWeekMtgs = 
Monday, Friday

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

Замена флага в переменной

Предположим, что собрание группы постоянно изменено с Wednesday кому Thursday. Удалить Wednesday, использовать bitxorи использовать bitor добавить Thursday. Поскольку это постоянное изменение, обновите teamMtgs и allMtgs переменные.

teamMtgs = bitor(...
    (bitand(teamMtgs,...
        bitnot(NetDocEnum.MyDays.Wednesday))),...
    NetDocEnum.MyDays.Thursday);
allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);
teamMtgs
allMtgs
teamMtgs = 
Thursday, Friday

allMtgs = 
Monday, Thursday, Friday

Тестирование на участие

Создать следующее RemindMe функция:

function RemindMe(day)
% day = NetDocEnum.MyDays enumeration
teamMtgs = bitor(...
    NetDocEnum.MyDays.Friday,...
    NetDocEnum.MyDays.Wednesday);
allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);

if eq(day,bitand(day,teamMtgs))
    disp('Team meeting today.')
elseif eq(day,bitand(day,allMtgs))
    disp('Meeting today.')    
else
    disp('No meetings today!')
end
end

Используйте RemindMe функция:

today = NetDocEnum.MyDays.Monday;
RemindMe(today)
Meeting today.

См. также

| | |

Связанные темы