Понимание бит-масок в C#

Некоторые значения, включая некоторые свойства, определенные платформой .NET Framework, представляют собой бит-маски. Это означает, что каждый бит в значении означает что-то. Например, перечисление AnchorStyles, которое определяет, как элементы управления привязаны в своих родителях, определяет четыре значения: Top, Bottom, Left, tt> и Right. Численно эти значения соответствуют 1, 2, 4 и 8. В качестве двоичных значений они 0001, 0010, 0100 и 1000 . Обратите внимание, что каждое значение имеет ровно 1 бит и что ни один из них не имеет одного и того же бита.

Из-за этого вы можете комбинировать значения, используя побитовые операции. (См. Использование битовых операций в C# .) Например, значение AnchorStyles.Bottom | AnchorStyles.Left эквивалентен 0010 | 0100, который равен 0110.

Чтобы установить значение для бит-масок, таких как этот, вы можете установить значение, равное побитовому Or для значений, которые вы хотите использовать. Например, эта примерная программа использует следующий код, чтобы установить свойство Anchor элемента управления PictureBox в Bottom, Right.

// Якорь PictureBox.
private void Form1_Load(object sender, EventArgs e)
{
    // Якорь PictureBox внизу и справа.
    picAnchor.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
}

Способ работы побитовых операторов приводит к некоторой семантической путанице. Этот код использует побитовое Or для создания значения, которое означает, что элемент управления должен быть привязан в нижней части и вправо. Это связано с тем, что побитовый оператор Or приводит к установке нескольких бит.

Вы также можете использовать другие побитовые операции для изменения значения. Например, следующий код очистит параметр Top из свойства Anchor элемента управления, оставив любые другие параметры без изменений.

picAnchor.Anchor &= ~AnchorStyles.Top;

Что делает этот код, это И текущее значение со значением Not Top. Значение Not Top имеет каждый бит, за исключением тех случаев, когда установлен бит значения Top. В этом случае это ~ 0001 или 1110. Когда вы И это значение с текущим значением свойства, вы получите те же биты, что и в текущем значении, за исключением самого правого бита, который очищается финальным битом в 1110 .

Часто значения, используемые таким образом, называются масками , потому что они маскируют один или несколько битов значения. (Это немного похоже на использование маски или трафарета с банкой с распылительной краской, чтобы ограничить место рисования. В этом примере маска 1110 делает краску «очистить бит» влияет только на окончательный бит в значении. (Если вам не нравится аналогия, игнорируйте его.)

Следующий код добавляет значение Left к текущему значению свойства Anchor.

picAnchor.Anchor |= AnchorStyles.Left;

Этот код использует побитовый оператор Or, чтобы установить бит, соответствующий значению Left 0100. Например, если начальное значение свойства 1001, то новое значение будет 1001 | 0100 = 1101.

Источник: http://csharphelper.com/blog/2016/10/understand-bit-masks-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector