Questa è la mia soluzione corrente per trovare il potere precedente e successivo di due di qualsiasi numero intero positivo n e anche una piccola funzione per determinare se un numero è potenza di due.
Questa implementazione è per 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
uso Esempio:
10.power_of_two? => false
16.power_of_two? => true
10.next_power_of_two => 16
10.prev_power_of_two => 8
Per la potenza di due precedenti, trovando il successivo e dividendo per due è leggermente più lento del metodo di cui sopra.
Non sono sicuro di come funzioni con Bignums.
ottenere il prossimo potenza di 2, e dividere per 2. ..? – GManNickG
Spostamento binario? Dividere? –
Prendi il prossimo, dividi per 2. –