Я пытался решить эту проблему некоторое время, но не мог только с целочисленными арифметическими и побитовыми операторами. Однако я думаю его возможное, и это должно быть довольно легко. Что я пропускаю?
Проблема: для получения целочисленного значения произвольной длины (это не относится к проблеме) с, он - X младших значащих наборов битов к 1 и остальные к 0. Например, учитывая номер 31, я должен получить целочисленное значение, которое равняется 0x7FFFFFFF (31 младший значащий бит равняется 1 и остальным нули).
Конечно, с помощью осуществления операции ИЛИ цикла смещенный 1 для целого числа X раз сделает задание. Но это не решение, которое я ищу. Это должно быть больше в направлении (X << Y - 1)
, таким образом использование никаких циклов.
Попробуйте следующее:
uint.MaxValue >> (32 - something)
Я думаю, что следующее должно работать:
int mask = (int)Math.Pow(2, 31) - 1;
Это единственное математическое выражение, но оно не особенно эффективно, потому что вычисление мощности таким способом не очень хорошая идея. Однако, поскольку мы вычисляем степень двойки, мы можем сделать то же самое с помощью shift:
int mask = (1 << 31) - 1;