Я наткнулся на этот вопрос, пытаясь выяснить, что именно делает 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, чтобы иметь возможность что-то делать с битами слева.