Я хочу рассчитать 2 n -1 для 64-битного целочисленного значения. Что я сейчас делаю, это
for(i=0; i<n; i++) r|=1<<i;
и мне интересно, есть ли более элегантный способ сделать это. Линия находится во внутреннем цикле, поэтому мне нужно, чтобы она была быстрой.
Я думал о
r=(1ULL<<n)-1;
но он не работает для n=64
, потому что <<
определяется только
для значений n
до 63.
EDIT: Спасибо за ваши ответы и комментарии. Вот небольшая таблица с решениями, которые я пробовал и любил лучше всего. Второй столбец - это время в секундах моего (полностью ненаучного) теста.
<Предварительно > г = N2MINUSONE_LUT [п]; 3.9 lookup table = fastest, ответ от aviraldg r = n? ~ 0ull > (64 - n): 0ull; 5.9 быстрее без LUT, комментарий от Christoph г = (1ULL < < п) -1; 5.9 Явная, но НЕПРАВИЛЬНАЯ! r = (n == 64)? - 1: (1ULL < lt; n) -1; 7.0 Короткие, четкие и довольно быстрые ответы от Gabe г = ((1ULL < < (п/2)) < < ((п + 1)/2)) - 1; 8.2 Ницца, без спецификации. case, ответить, обратившись г = (1ULL < < п-1) + ((1ULL < < п-1) -1); 9.2 Ницца, без спецификации. case, ответ от David Lively r = pow (2, n) -1; 99.0 Просто для сравнения для (i = 0; я < n; я ++) r | = 1 < i; 123.7 Мое первоначальное решение = ламеЯ принял
r =n?~0ull>>(64 - n):0ull;
как ответ, потому что это, на мой взгляд, самое изящное решение. Это был Christoph, который сначала придумал это, но, к сожалению, он только разместил его в комментарий. Jens Gustedt добавил действительно хорошее объяснение, поэтому я принимаю его ответ вместо этого. Поскольку мне понравилась таблица поиска , она получила 50 очков репутации через награду.