Формула цикла сдвига влево


Я нашел следующий код в примере программы:

const unsigned int n = /* something */
unsigned int i = 1;
for (unsigned int j = 1; j < n-1; ++j) {
    i <<= 1;
}
Существует ли прямая формула для вычисления i из n Без цикла?
2 2

2 ответа:

Точнее:

Предполагая, что unsigned int равен 16 битам (минимум, как указано стандартом C++)

i = ( n < 18 ) ? ( ( n >= 2 ) ? ( 1 << (n-2) ) : 1 ) : 0;

Вы можете использовать:

i = 1 << (n - 2);

Или более строго:

#include <limits.h> /* for CHAR_BIT */

const unsigned int n = /* something */;
unsigned int i  = 1;

if( (n - 2) > 0 && (n - 2) < (sizeof(i) * CHAR_BIT) ) {
  i = 1 << (n - 2);
}