Esta es mi solución actual para encontrar las potencias siguientes y anteriores de dos de cualquier entero positivo n dado y también una pequeña función para determinar si un número es potencia de dos.
Esta implementación es para Ruby.
class Integer
def power_of_two?
(self & (self - 1) == 0)
end
def next_power_of_two
return 1 if self <= 0
val = self
val = val - 1
val = (val >> 1) | val
val = (val >> 2) | val
val = (val >> 4) | val
val = (val >> 8) | val
val = (val >> 16) | val
val = (val >> 32) | val if self.class == Bignum
val = val + 1
end
def prev_power_of_two
return 1 if self <= 0
val = self
val = val - 1
val = (val >> 1) | val
val = (val >> 2) | val
val = (val >> 4) | val
val = (val >> 8) | val
val = (val >> 16) | val
val = (val >> 32) | val if self.class == Bignum
val = val - (val >> 1)
end
end
Ejemplo uso:
10.power_of_two? => false
16.power_of_two? => true
10.next_power_of_two => 16
10.prev_power_of_two => 8
Para la potencia anterior de dos, encontrar el siguiente y dividiendo por dos es ligeramente más lento que el método anterior.
No estoy seguro de cómo funciona con Bignums.
obtener el siguiente potencia de 2, y se divide por 2. ..? – GManNickG
Cambio binario? ¿Dividir? –
Obtenga la siguiente, divida por 2. –