java - trigonometricas - métodos del paquete math
Encuentre si un número es una potencia de dos sin función matemática o función de registro (6)
La solución sencilla:
bool isPowerOfTwo(int n) {
// All values < 1 cannot be (positive, at least) powers of two.
if (n < 1) return false;
// Keep shifting bits.
while (n > 1) {
// Since n > 1, the low bit set means at least two bits must
// be set, making n no longer a power of two.
if (n & 0x1) return false;
// Throw away the bottom (zero) bit.
n >>= 1;
}
// Only one bit was set, therefore, n is a power of two.
return true;
}
Por supuesto, esto no es tan óptimo como algunas de las otras soluciones de trucos de bits (que son bastante inteligentes), pero es muy fácil ver cómo funciona y verificar que funcione en su cabeza.
Para la entrada 4
, obtenemos:
n = 4 (0x100)
run loop
n = 2 (0x10)
run loop
n = 1 (0x1)
return true
Para una entrada no válida, como 5
, obtenemos:
n = 5 (0x101)
return false (0x101 & 0x1 => 0x1, which is truthy)
Quiero saber si un número ingresado por el usuario es una potencia de dos o no.
Mi código no funciona.
public class power_of_two
{
public static void main(String args[])
{
Scanner in=new Scanner(System.in);
System.out.println("Enter the number : ");
int num = in.nextInt();
int other = 1;
if(((~num) & 1) == 1)
{
System.out.println("The number is a power of two");
}
else
{
System.out.println("The number is a NOT A power of two");
}
}
}
Déjame saber cómo puedo encontrar el poder de dos números.
Por ejemplo 8 es una potencia de 2.
22 no es una potencia de 2, etc.
Puede utilizar el bitwise AND (&) operator
:
return (num & -num) == num
¿Por qué esto funciona?
Considere el número 8, ¿qué es en binario (suponiendo 32 bits)?
0000 0000 0000 0000 0000 0000 0000 1000
Ahora veamos como se representa -8? 1
1111 1111 1111 1111 1111 1111 1111 1000
Finalmente ... calculemos 8 & -8
:
0000 0000 0000 0000 0000 0000 0000 1000 8
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ &
1111 1111 1111 1111 1111 1111 1111 1000 -8
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 1000 8 ¯/_(ツ)_/¯
Ahora tomemos otro ejemplo, digamos 7
, que no es potencia de dos.
0000 0000 0000 0000 0000 0000 0000 0111 7
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ &
1111 1111 1111 1111 1111 1111 1111 1001 -7
---------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001 != 7 ¯/_(ة_ة)_/¯
Como lo mencionó @arshajii, piense qué pasará si num
es cero. Le dejaré la solución :)
1 Una buena manera de recordar cómo calcular eso: comience desde el bit más a la derecha, por cada 0 que vea, no lo cambie, cuando vea 1, déjelo y continúe, pero a partir de ahora, invierta todos los bits. Traté de explicar esto más here .
Puedes probar si un entero positivo n
es una potencia de 2 con algo como
(n & (n - 1)) == 0
Si n
puede ser no positivo (es decir, negativo o cero), debe usar
(n > 0) && ((n & (n - 1)) == 0)
Si n
es realmente una potencia de 2, entonces en binario se verá así:
10000000...
entonces n - 1
parece
01111111...
y cuando tengamos bitwise-AND ellos:
10000000...
& 01111111...
-----------
00000000...
Ahora, si n
no es una potencia de 2, entonces su representación binaria tendrá algunos otros 1 además del 1 inicial, lo que significa que tanto n
como n - 1
tendrán el mismo 1 bit inicial (ya que restar 1 no puede desactiva este bit si hay otro 1 en la representación binaria en algún lugar). Por lo tanto, la operación &
no puede producir 0
si n
no es una potencia de 2, ya que los dos bits principales de n
y n - 1
producirán 1
en sí mismo. Esto, por supuesto, asume que n
es positivo.
Esto también se explica en "Algoritmo rápido para verificar si un número positivo es una potencia de dos" en Wikipedia.
Verificación rápida de la cordura:
for (int i = 1; i <= 100; i++) {
if ((i & (i - 1)) == 0)
System.out.println(i);
}
1 2 4 8 16 32 64
Una solución muy simple.
int n = 8; // any integer and you can take it from user also
for(;n>0;n++){
if(n%2 != 0) {
System.out.println("not a power of two")
return;
} // if ends here
n = n/2;
}// for ends here
System.out.println("power of two")
double input = 22;
while(((input != 2) && input % 2 == 0) || input == 1) {
input = input /2;
}
return input == 2;
Continúa dividiéndolo por 2 hasta que alcances 1 o un número impar. Si llega a 1 es una potencia de 2, de lo contrario no lo es.
public boolean isPowerOfTwo(int n){
boolean isPower=false;
int temp=n;
while(temp>=2){
if(temp%2==0){
isPower=true;
}else{
isPower=false;
break;
}
temp=temp/2;
}
if(isPower){
System.out.println("power of 2");
}else{
System.out.println("not power of 2");
}
return isPower;
}