Когда дело доходит до размеров массивов, я подозреваю, что есть две причины, по которым предпочтительны полномочия двух. Один из них, о чем свидетельствуют несколько ответов здесь, заключается в том, что программисты, которые не знают, что происходит «под капотом», похоже, имеют общий смысл, что можно как-то более эффективно использовать силу двух. Другой (в основном исторический) относится к циклическим буферам.
Циклические буферы, которые являются степенями двух, могут обрабатываться более легко и быстро, используя маски, для индексов чтения и записи (или указателей) вместо использования обычно более медленной работы по модулю или использования условий, требующих ветвей. Это имело решающее значение для старых машин, но все еще может быть важным для передачи данных больших объемов - например, Графические процессоры
Например, в C, то число байтов, доступных для чтения в циклическом буфере может быть получено:
pending = (SIZE + wr - rd) & (SIZE - 1);
Если не используя силу двух, то эквивалент будет:
pending = (SIZE + wr - rd) % (SIZE - 1);
на машинах, которые не реализуют инструкции деление/модуль, который немного «%» может занять несколько сотен циклов, так что вам нужно будет что-то вроде:
if (wr >= rd)
pending = wr - rd;
else
pending = (SIZE + wr) - rd;
Что загромождает код и вызывает ветвление, которое может остановить конвейер команд.
Записи в буфер, который был чем-то вроде
buf[wr++] = x;
if (wr == SIZE)
rd = 0;
становится (в целом) более эффективным:
buf[wr++] = x;
wr &= SIZE-1;
Конечно, если вы использовали беззнаковые 8 разрядные переменный индекс массив 256 записи тогда вам даже не нужно было маскировать.
Я не думаю, что на этот вопрос можно ответить, не зная, для чего используется константа. Целью константы является то, что определяет, какие значения может принять константа. –
Примером может быть размер массива int. – 2009-08-08 17:09:08
Я думаю, вы думаете, что мы используем силы на 2 больше, чем они используются на самом деле. Люди будут использовать массив из 100 ints, такой же, как массив из 256. Битмаскирование является основной причиной для полномочий 2 и не применяется к размерам массивов. –