Что делает функция CreateMask BitVector32? - PullRequest
3 голосов
/ 15 сентября 2009

Что делает CreateMask() функция BitVector32? Я не понял, что такое маска.

Хотелось бы понять следующие строки кода. Создает ли маска просто значение true?

  // Creates and initializes a BitVector32 with all bit flags set to FALSE.
  BitVector32 myBV = new BitVector32( 0 );

  // Creates masks to isolate each of the first five bit flags.
  int myBit1 = BitVector32.CreateMask();
  int myBit2 = BitVector32.CreateMask( myBit1 );
  int myBit3 = BitVector32.CreateMask( myBit2 );
  int myBit4 = BitVector32.CreateMask( myBit3 );
  int myBit5 = BitVector32.CreateMask( myBit4 );

  // Sets the alternating bits to TRUE.
  Console.WriteLine( "Setting alternating bits to TRUE:" );
  Console.WriteLine( "   Initial:         {0}", myBV.ToString() );
  myBV[myBit1] = true;
  Console.WriteLine( "   myBit1 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit3] = true;
  Console.WriteLine( "   myBit3 = TRUE:   {0}", myBV.ToString() );
  myBV[myBit5] = true;
  Console.WriteLine( "   myBit5 = TRUE:   {0}", myBV.ToString() );

Каково практическое применение этого?

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

BitVector32.CreateMask() - это замена оператора левого сдвига (<<), который в большинстве случаев приводит к умножению на 2 (сдвиг влево не круговой, поэтому вы можете начать терять цифры, больше объяснил здесь )

BitVector32 vector = new BitVector32();
int bit1 = BitVector32.CreateMask();
int bit2 = BitVector32.CreateMask(bit1);
int bit3 = 1 << 2;
int bit5 = 1 << 4;

Console.WriteLine(vector.ToString());
vector[bit1 | bit2 | bit3 | bit5] = true;
Console.WriteLine(vector.ToString());

Выход:

BitVector32 {00000000000000000000000000000000} BitVector32 {00000000000000000000000000010111}

1 голос
/ 15 сентября 2009

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

Возможно, вы захотите проверить Википедию , что такое маска.

Вкратце: маска - это шаблон в виде массива 1 с для интересующих вас битов и 0 для остальных.

Если у вас есть что-то вроде 01010 и вы заинтересованы в получении последних 3 битов, ваша маска будет выглядеть как 00111. Затем, когда вы выполняете битовое И в 01010 и 00111, вы получите последние три бита (00010) поскольку AND только 1, если оба бита установлены, и ни один из битов, кроме первых трех, не установлен в маске.

Пример может быть проще для понимания:

BitVector32.CreateMask() => 1 (binary 1)
BitVector32.CreateMask(1) => 2 (binary 10)
BitVector32.CreateMask(2) => 4 (binary 100)
BitVector32.CreateMask(4) => 8 (binary 1000)

CreateMask(int) возвращает заданное число, умноженное на 2.

ПРИМЕЧАНИЕ : Первый бит является младшим значащим битом, то есть битом, самым дальним справа.

0 голосов
/ 11 июля 2012

Я наткнулся на этот вопрос, пытаясь выяснить, что именно делает CreateMask. Я не чувствовал, что текущие ответы ответили на вопрос для меня. После некоторого чтения и экспериментов я хотел бы поделиться своими выводами:

В основном то, что говорит Максимилиан, почти правильно: «BitVector32.CreateMask - это замена оператора левого сдвига (<<), который в большинстве случаев приводит к умножению на 2». </p>

Поскольку << является бинарным оператором, а CreateMask принимает только один аргумент, я хотел бы добавить, что <code>BitVector32.CreateMask(x) эквивалентно x << 1.

1010 * пограничных случаев * Однако BitVector32.CreateMask(x) не эквивалентен x << 1 для двух пограничных случаев: BitVector32.CreateMask(int.MinValue)
InvalidOperationException будет брошен. int.MinValue соответствует 10000000000000000000000000000000. Это кажется немного странным. Особенно учитывая, что любое другое значение с 1 как крайний левый бит (т.е. отрицательные числа) работает нормально. Напротив: int.MinValue << 1 не будет выдавать исключение, а просто вернет 0. При звонке BitVector32.CreateMask(0) (или BitVector32.CreateMask()). Это вернет 1
(т.е. 00000000000000000000000000000000 становится 00000000000000000000000000000001),
тогда как 0 << 1 просто вернет 0. </p> Умножение на 2

CreateMask почти всегда эквивалентно умножению на 2. Кроме двух вышеупомянутых особых случаев, отличается, когда второй бит слева отличается от крайнего левого бита . Int подписано, поэтому самый левый бит указывает знак. В этом сценарии знак перевернут. Например. CreateMask(-1) (или 11111111111111111111111111111111) приводит к -2 (или 11111111111111111111111111111110), но CreateMask(int.MaxValue) (или 01111111111111111111111111111111) также приводит к -2.

В любом случае, вы, вероятно, не должны использовать его для этой цели. Как я понимаю, когда вы используете BitVector32, вам действительно следует рассматривать только последовательность из 32 битов. Тот факт, что они используют целые числа в сочетании с BitVector32, возможно, объясняется тем, что это удобно.

Когда полезен CreateMask?

Честно говоря, я не знаю. Из документации и названия «предыдущего» аргумента функции предполагается, что они предназначены для использования в некоторой последовательности: «Используйте CreateMask () для создания первой маски в серии и CreateMask (int) для всех последующих масок. "

Однако в примере кода они используют его для создания масок для первых 5 битов, чтобы впоследствии выполнить некоторые операции с этими битами. Я не могу представить, чтобы они ожидали, что вы напишете 32 вызова подряд в CreateMask, чтобы иметь возможность что-то делать с битами слева.

0 голосов
/ 21 октября 2010

Проверьте этот другой пост текст ссылки . Кроме того, CreateMask не возвращает указанное число, умноженное на 2. CreateMask создает битовую маску на основе определенной позиции в 32-битном слове (это передаваемый параметр), который обычно равен x ^ 2, когда вы говорите об одном бите (флаг).

...