Понимание бит-масок в C#
Некоторые значения, включая некоторые свойства, определенные платформой .NET Framework, представляют собой бит-маски. Это означает, что каждый бит в значении означает что-то. Например, перечисление AnchorStyles, которое определяет, как элементы управления привязаны в своих родителях, определяет четыре значения: Top, Bottom, Left, tt> и Right. Численно эти значения соответствуют 1, 2, 4 и 8. В качестве двоичных значений они 0001, 0010, 0100 и 1000 . Обратите внимание, что каждое значение имеет ровно 1 бит и что ни один из них не имеет одного и того же бита.
Из-за этого вы можете комбинировать значения, используя побитовые операции. (См.
Чтобы установить значение для бит-масок, таких как этот, вы можете установить значение, равное побитовому Or для значений, которые вы хотите использовать. Например, эта примерная программа использует следующий код, чтобы установить свойство Anchor элемента управления PictureBox в Bottom, Right.
1 2 3 4 5 6 |
// Якорь PictureBox. private void Form1_Load(object sender, EventArgs e) { // Якорь PictureBox внизу и справа. picAnchor.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; } |
Способ работы побитовых операторов приводит к некоторой семантической путанице. Этот код использует побитовое Or для создания значения, которое означает, что элемент управления должен быть привязан в нижней части и вправо. Это связано с тем, что побитовый оператор Or приводит к установке нескольких бит.
Вы также можете использовать другие побитовые операции для изменения значения. Например, следующий код очистит параметр Top из свойства Anchor элемента управления, оставив любые другие параметры без изменений.
1 |
picAnchor.Anchor &= ~AnchorStyles.Top; |
Что делает этот код, это И текущее значение со значением Not Top. Значение Not Top имеет каждый бит, за исключением тех случаев, когда установлен бит значения Top. В этом случае это ~ 0001 или 1110. Когда вы И это значение с текущим значением свойства, вы получите те же биты, что и в текущем значении, за исключением самого правого бита, который очищается финальным битом в 1110 tt >. р>
Часто значения, используемые таким образом, называются масками , потому что они маскируют один или несколько битов значения. (Это немного похоже на использование маски или трафарета с банкой с распылительной краской, чтобы ограничить место рисования. В этом примере маска 1110 делает краску «очистить бит» влияет только на окончательный бит в значении. (Если вам не нравится аналогия, игнорируйте его.)
Следующий код добавляет значение Left к текущему значению свойства Anchor.
1 |
picAnchor.Anchor |= AnchorStyles.Left; |
Этот код использует побитовый оператор Or, чтобы установить бит, соответствующий значению Left 0100. Например, если начальное значение свойства 1001, то новое значение будет 1001 | 0100 = 1101.