Самый быстрый способ вычислить битовую маску Х? - PullRequest
5 голосов
/ 19 апреля 2010

Я пытался решить эту проблему некоторое время, но не смог с помощью только целочисленных арифметических и побитовых операторов. Тем не менее, я думаю, что это возможно, и это должно быть довольно легко. Чего мне не хватает?

Проблема: получить целочисленное значение произвольной длины (это не имеет отношения к проблеме) с X младшими значащими битами, установленными в 1, а остальные в 0. Например, с учетом числа 31, мне нужно получить целочисленное значение, равное 0x7FFFFFFF (31 младший бит равен 1, а остальные нули).

Конечно, использование цикла ИЛИ - смещение сдвинутой 1 до целого X раз сделает эту работу. Но это не то решение, которое я ищу. Это должно быть больше в направлении (X << Y - 1), таким образом, без использования петель.

Ответы [ 3 ]

6 голосов
/ 19 апреля 2010

Попробуйте: (1 << X) - 1 </p>

2 голосов
/ 19 апреля 2010

Попробуйте это:

uint.MaxValue >> (32 - something)
0 голосов
/ 19 апреля 2010

Я думаю, что должно работать следующее:

int mask = (int)Math.Pow(2, 31) - 1;

Это одно математическое выражение, но оно не особенно эффективно, потому что вычисление мощности таким способом не очень хорошая идея. Однако, поскольку мы рассчитываем степень 2, мы можем сделать то же самое, используя shift:

int mask = (1 << 31) - 1;
...