Cuando se trata de tamaños de matriz, sospecho que hay dos razones por las cuales se favorecen los poderes de dos. Una de ellas, como lo demuestran varias respuestas aquí, es que los programadores que no saben qué está pasando "bajo el capó" parecen tener una sensación general de que de alguna manera podría ser más eficiente usar un poder de dos. El otro (en su mayor parte histórico ahora) tiene que ver con los búferes cíclicos.
Los búfers cíclicos que tienen potencias de dos pueden manejarse de manera más fácil y rápida utilizando máscaras en los índices de lectura y escritura (o punteros) en lugar de usar la operación de módulo normalmente más lenta o usar condiciones que requieren bifurcaciones. Esto fue crucial en las máquinas más antiguas, pero aún puede ser importante para transferir grandes cantidades de datos, por ej. el procesamiento de gráficos
Por ejemplo, en C, el número de bytes disponibles para ser leídos en una memoria intermedia cíclica se pueden obtener por:
pending = (SIZE + wr - rd) & (SIZE - 1);
Si no se utiliza potencia de dos, entonces el equivalente sería:
pending = (SIZE + wr - rd) % (SIZE - 1);
En las máquinas que no implementan una instrucción de división/módulo de ese pequeño "%" podría tomar varios cientos de ciclos, por lo que se necesita algo como:
if (wr >= rd)
pending = wr - rd;
else
pending = (SIZE + wr) - rd;
Que desordena el código y causa la bifurcación que puede paralizar la tubería de instrucción.
escritura a la memoria intermedia que era algo así como
buf[wr++] = x;
if (wr == SIZE)
rd = 0;
se convierte en el (generalmente) más eficiente:
buf[wr++] = x;
wr &= SIZE-1;
Por supuesto, si se ha utilizado una variable de 8 bits sin signo de índice de una matriz 256 de entrada entonces ni siquiera necesitas hacer el enmascaramiento.
No creo que se pueda responder a esa pregunta sin saber para qué se usa la constante. El propósito de la constante es qué define qué valores puede asumir la constante. –
Un ejemplo podría ser el tamaño de una matriz de entradas. –
Creo que estás pensando que usamos poderes de 2 más de los que realmente se usan. Las personas usarán una matriz de 100 ints igual que una matriz de 256. El enmascaramiento de bits es la razón principal de las potencias de 2 y no se aplica a los tamaños de las matrices. –