Dado un número N que tiene solo un ‘1’ y todos los demás ‘0’ en su representación binaria, encuentre la posición del único bit establecido. Si hay 0 o más de 1 bit establecido, la respuesta debe ser -1. La posición del bit establecido ‘1’ debe contarse comenzando con 1 desde el lado LSB en la representación binaria del número.
Fuente: Entrevista de Microsoft | 18
Ejemplos:-
Input: N = 2 Output: 2 Explanation: 2 is represented as "10" in Binary. As we see there's only one set bit and it's in Position 2 and thus the Output 2.
aquí hay otro ejemplo
Input: N = 5 Output: -1 Explanation: 5 is represented as "101" in Binary. As we see there's two set bits and thus the Output -1.
La idea es comenzar desde el bit más a la derecha y verificar el valor de cada bit uno por uno. A continuación se muestra un algoritmo detallado.
1) Si el número es potencia de dos, entonces solo su representación binaria contiene solo un ‘1’. Por eso comprueba si el número dado es una potencia de 2 o no. Si el número dado no es una potencia de 2, imprima el mensaje de error y salga.
2) Inicializar dos variables; i = 1 (para bucles) y pos = 1 (para encontrar la posición del bit establecido)
3) Dentro del bucle, haga AND bit a bit de i y el número ‘N’. Si el valor de esta operación es verdadero, entonces se establece el bit «pos», así que rompa el bucle y regrese a la posición. De lo contrario, incremente “pos” en 1 y desplace i a la izquierda en 1 y repita el procedimiento.
C++
// C++ program to find position of only set bit in a given number #include <bits/stdc++.h> using namespace std; // A utility function to check whether n is a power of 2 or not. // See http://goo.gl/17Arj int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned i = 1, pos = 1; // Iterate through bits of n till we find a set bit // i&n will be non-zero only when 'i' and 'n' have a set bit // at same position while (!(i & n)) { // Unset current bit and set the next bit in 'i' i = i << 1; // increment position ++pos; } return pos; } // Driver program to test above function int main(void) { int n = 16; int pos = findPosition(n); (pos == -1) ? cout << "n = " << n << ", Invalid number" << endl : cout << "n = " << n << ", Position " << pos << endl; n = 12; pos = findPosition(n); (pos == -1) ? cout << "n = " << n << ", Invalid number" << endl : cout << "n = " << n << ", Position " << pos << endl; n = 128; pos = findPosition(n); (pos == -1) ? cout << "n = " << n << ", Invalid number" << endl : cout << "n = " << n << ", Position " << pos << endl; return 0; } // This code is contributed by rathbhupendra
C
// C program to find position of only set bit in a given number #include <stdio.h> // A utility function to check whether n is a power of 2 or not. // See http://goo.gl/17Arj int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned i = 1, pos = 1; // Iterate through bits of n till we find a set bit // i&n will be non-zero only when 'i' and 'n' have a set bit // at same position while (!(i & n)) { // Unset current bit and set the next bit in 'i' i = i << 1; // increment position ++pos; } return pos; } // Driver program to test above function int main(void) { int n = 16; int pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 12; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 128; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); return 0; }
Java
// Java program to find position of only set bit in a given number class GFG { // A utility function to check whether n is a power of 2 or not. // See http://goo.gl/17Arj static boolean isPowerOfTwo(int n) { return (n > 0 && ((n & (n - 1)) == 0)) ? true : false; } // Returns position of the only set bit in 'n' static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; int i = 1, pos = 1; // Iterate through bits of n till we find a set bit // i&n will be non-zero only when 'i' and 'n' have a set bit // at same position while ((i & n) == 0) { // Unset current bit and set the next bit in 'i' i = i << 1; // increment position ++pos; } return pos; } // Driver code public static void main(String[] args) { int n = 16; int pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); } } // This code is contributed by mits
Python3
# Python3 program to find position of # only set bit in a given number # A utility function to check # whether n is power of 2 or # not. def isPowerOfTwo(n): return (True if(n > 0 and ((n & (n - 1)) > 0)) else False); # Returns position of the # only set bit in 'n' def findPosition(n): if (isPowerOfTwo(n) == True): return -1; i = 1; pos = 1; # Iterate through bits of n # till we find a set bit i&n # will be non-zero only when # 'i' and 'n' have a set bit # at same position while ((i & n) == 0): # Unset current bit and # set the next bit in 'i' i = i << 1; # increment position pos += 1; return pos; # Driver Code n = 16; pos = findPosition(n); if (pos == -1): print("n =", n, ", Invalid number"); else: print("n =", n, ", Position ", pos); n = 12; pos = findPosition(n); if (pos == -1): print("n =", n, ", Invalid number"); else: print("n =", n, ", Position ", pos); n = 128; pos = findPosition(n); if (pos == -1): print("n =", n, ", Invalid number"); else: print("n =", n, ", Position ", pos); # This code is contributed by mits
C#
// C# program to find position of only set bit in a given number using System; class GFG { // A utility function to check whether n is a power of 2 or not. // See http://goo.gl/17Arj static bool isPowerOfTwo(int n) { return (n > 0 && ((n & (n - 1)) == 0)) ? true : false; } // Returns position of the only set bit in 'n' static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; int i = 1, pos = 1; // Iterate through bits of n till we find a set bit // i&n will be non-zero only when 'i' and 'n' have a set bit // at same position while ((i & n) == 0) { // Unset current bit and set the next bit in 'i' i = i << 1; // increment position ++pos; } return pos; } // Driver code static void Main() { int n = 16; int pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); } } // This code is contributed by mits
PHP
<?php // PHP program to find position of // only set bit in a given number // A utility function to check // whether n is power of 2 or // not. See http://goo.gl/17Arj function isPowerOfTwo($n) { return $n && (!($n & ($n - 1))); } // Returns position of the // only set bit in 'n' function findPosition($n) { if (!isPowerOfTwo($n)) return -1; $i = 1; $pos = 1; // Iterate through bits of n // till we find a set bit i&n // will be non-zero only when // 'i' and 'n' have a set bit // at same position while (!($i & $n)) { // Unset current bit and // set the next bit in 'i' $i = $i << 1; // increment position ++$pos; } return $pos; } // Driver Code $n = 16; $pos = findPosition($n); if (($pos == -1) == true) echo "n =", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position ", $pos, "\n"; $n = 12; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n =", $n, ", ", " Position ", $pos, "\n"; $n = 128; $pos = findPosition($n); if(($pos == -1) == true) echo "n =", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position ", $pos, "\n"; // This code is contributed by ajit ?>
Javascript
<script> // JavaScript program to find position of // only set bit in a given number // A utility function to check // whether n is power of 2 or // not. function isPowerOfTwo(n){ return (n > 0 && ((n & (n - 1)) == 0)) ? true : false; } // Returns position of the // only set bit in 'n' function findPosition(n){ if (isPowerOfTwo(n) == false) return -1; var i = 1; var pos = 1; // Iterate through bits of n // till we find a set bit i&n // will be non-zero only when // 'i' and 'n' have a set bit // at same position while ((i & n) == 0){ // Unset current bit and // set the next bit in 'i' i = i << 1; // increment position pos += 1; } return pos; } // Driver Code var n = 16; var pos = findPosition(n); if (pos == -1) document.write("n =" + n + ", Invalid number"); else document.write("n =" + n + ", Position " + pos); document.write("<br>"); n = 12; pos = findPosition(n); if (pos == -1) document.write("n =" + n + ", Invalid number"); else document.write("n =" + n + ", Position ", pos); document.write("<br>"); n = 128; pos = findPosition(n); if (pos == -1) document.write("n =" + n + ", Invalid number"); else document.write("n =" + n + ", Position " + pos); // This code is contributed by AnkThon </script>
Producción :
n = 16, Position 5 n = 12, Invalid number n = 128, Position 8
Complejidad del tiempo: O(log 2 n), donde n es el número dado
Complejidad espacial: O(1)
El siguiente es otro método para este problema. La idea es desplazar uno por uno a la derecha el bit establecido del número ‘n’ dado hasta que ‘n’ se convierta en 0. Cuente cuántas veces desplazamos para hacer que ‘n’ sea cero. El conteo final es la posición del bit establecido.
C++
// C++ program to find position of only set bit in a given number #include <bits/stdc++.h> using namespace std; // A utility function to check whether n is power of 2 or not int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned count = 0; // One by one move the only set bit to right till it reaches end while (n) { n = n >> 1; // increment count of shifts ++count; } return count; } // Driver code int main(void) { int n = 0; int pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<< pos<<endl; n = 12; pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<< pos<<endl; n = 128; pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<< pos<<endl; return 0; } // This code is contributed by rathbhupendra
C
// C program to find position of only set bit in a given number #include <stdio.h> // A utility function to check whether n is power of 2 or not int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned count = 0; // One by one move the only set bit to right till it reaches end while (n) { n = n >> 1; // increment count of shifts ++count; } return count; } // Driver program to test above function int main(void) { int n = 0; int pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 12; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 128; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); return 0; }
Java
// Java program to find position of only // set bit in a given number class GFG { // A utility function to check whether // n is power of 2 or not static boolean isPowerOfTwo(int n) { return n > 0 && ((n & (n - 1)) == 0); } // Returns position of the only set bit in 'n' static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; int count = 0; // One by one move the only set bit // to right till it reaches end while (n > 0) { n = n >> 1; // increment count of shifts ++count; } return count; } // Driver code public static void main(String[] args) { int n = 0; int pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number"); else System.out.println("n = " + n + ", Position " + pos); } } // This code is contributed by mits
Python3
# Python 3 program to find position # of only set bit in a given number # A utility function to check whether # n is power of 2 or not def isPowerOfTwo(n) : return (n and ( not (n & (n-1)))) # Returns position of the only set bit in 'n' def findPosition(n) : if not isPowerOfTwo(n) : return -1 count = 0 # One by one move the only set bit to # right till it reaches end while (n) : n = n >> 1 # increment count of shifts count += 1 return count # Driver program to test above function if __name__ == "__main__" : n = 0 pos = findPosition(n) if pos == -1 : print("n =", n, "Invalid number") else : print("n =", n, "Position", pos) n = 12 pos = findPosition(n) if pos == -1 : print("n =", n, "Invalid number") else : print("n =", n, "Position", pos) n = 128 pos = findPosition(n) if pos == -1 : print("n =", n, "Invalid number") else : print("n =", n, "Position", pos) # This code is contributed by ANKITRAI1
C#
// C# program to find position of only // set bit in a given number using System; class GFG { // A utility function to check whether // n is power of 2 or not static bool isPowerOfTwo(int n) { return n > 0 && ((n & (n - 1)) == 0); } // Returns position of the only set bit in 'n' static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; int count = 0; // One by one move the only set bit // to right till it reaches end while (n > 0) { n = n >> 1; // increment count of shifts ++count; } return count; } // Driver code static void Main() { int n = 0; int pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number"); else Console.WriteLine("n = " + n + ", Position " + pos); } } // This code is contributed by mits
PHP
<?php // PHP program to find position of // only set bit in a given number // A utility function to check // whether n is power of 2 or not function isPowerOfTwo($n) { return $n && (! ($n & ($n - 1))); } // Returns position of the // only set bit in 'n' function findPosition($n) { if (!isPowerOfTwo($n)) return -1; $count = 0; // One by one move the only set // bit to right till it reaches end while ($n) { $n = $n >> 1; // increment count of shifts ++$count; } return $count; } // Driver Code $n = 0; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position ", $pos, "\n"; $n = 12; $pos = findPosition($n); if (($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, " Position ", $pos, "\n"; $n = 128; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position ", $pos, "\n"; // This code is contributed by ajit ?>
Javascript
<script> // JavaScript program to find position // of only set bit in a given number // A utility function to check whether // n is power of 2 or not function isPowerOfTwo(n) { return (n && ( !(n & (n-1)))) } // Returns position of the only set bit in 'n' function findPosition(n) { if (!isPowerOfTwo(n)) return -1 var count = 0 // One by one move the only set bit to // right till it reaches end while (n) { n = n >> 1 // increment count of shifts count += 1 } return count } // Driver program to test above function var n = 0 var pos = findPosition(n) if (pos == -1) document.write("n = ", n, ", Invalid number ") else document.write("n =", n, ", Position ", pos) document.write("<br>") n = 12 pos = findPosition(n) if (pos == -1) document.write("n = ", n, ", Invalid number") else document.write("n = ", n, ", Position ", pos) document.write("<br>") n = 128 pos = findPosition(n) if (pos == -1) document.write("n = ", n, ", Invalid number") else document.write("n = ", n, ", Position ", pos) document.write("<br>") // This code is contributed by AnkThon </script>
Producción :
n = 0, Invalid number n = 12, Invalid number n = 128, Position 8
Complejidad del tiempo: O(log 2 n), donde n es el número dado
Complejidad espacial: O(1)
También podemos usar la base logarítmica 2 para encontrar la posición . Gracias a Arunkumar por sugerir esta solución.
C++
#include <bits/stdc++.h> using namespace std; unsigned int Log2n(unsigned int n) { return (n > 1) ? 1 + Log2n(n / 2) : 0; } int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; return Log2n(n) + 1; } // Driver code int main(void) { int n = 0; int pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<<pos<<" \n"; n = 12; pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<<pos<<" \n"; n = 128; pos = findPosition(n); (pos == -1) ? cout<<"n = "<<n<<", Invalid number\n" : cout<<"n = "<<n<<", Position "<<pos<<" \n"; return 0; } // This code is contributed by rathbhupendra
C
#include <stdio.h> unsigned int Log2n(unsigned int n) { return (n > 1) ? 1 + Log2n(n / 2) : 0; } int isPowerOfTwo(unsigned n) { return n && (!(n & (n - 1))); } int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; return Log2n(n) + 1; } // Driver program to test above function int main(void) { int n = 0; int pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 12; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); n = 128; pos = findPosition(n); (pos == -1) ? printf("n = %d, Invalid number\n", n) : printf("n = %d, Position %d \n", n, pos); return 0; }
Java
// Java program to find position // of only set bit in a given number class GFG { static int Log2n(int n) { return (n > 1) ? 1 + Log2n(n / 2) : 0; } static boolean isPowerOfTwo(int n) { return n > 0 && ((n & (n - 1)) == 0); } static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; return Log2n(n) + 1; } // Driver code public static void main(String[] args) { int n = 0; int pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number "); else System.out.println("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number "); else System.out.println("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) System.out.println("n = " + n + ", Invalid number "); else System.out.println("n = " + n + ", Position " + pos); } } // This code is contributed by mits
Python3
# Python program to find position # of only set bit in a given number def Log2n(n): if (n > 1): return (1 + Log2n(n / 2)) else: return 0 # A utility function to check # whether n is power of 2 or not def isPowerOfTwo(n): return n and (not (n & (n-1)) ) def findPosition(n): if (not isPowerOfTwo(n)): return -1 return Log2n(n) + 1 # Driver program to test above function n = 0 pos = findPosition(n) if(pos == -1): print("n =", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) n = 12 pos = findPosition(n) if(pos == -1): print("n =", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) n = 128 pos = findPosition(n) if(pos == -1): print("n = ", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) # This code is contributed # by Sumit Sudhakar
C#
// C# program to find position // of only set bit in a given number using System; class GFG { static int Log2n(int n) { return (n > 1) ? 1 + Log2n(n / 2) : 0; } static bool isPowerOfTwo(int n) { return n > 0 && ((n & (n - 1)) == 0); } static int findPosition(int n) { if (!isPowerOfTwo(n)) return -1; return Log2n(n) + 1; } // Driver program to test above function static void Main() { int n = 0; int pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number "); else Console.WriteLine("n = " + n + ", Position " + pos); n = 12; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number "); else Console.WriteLine("n = " + n + ", Position " + pos); n = 128; pos = findPosition(n); if (pos == -1) Console.WriteLine("n = " + n + ", Invalid number "); else Console.WriteLine("n = " + n + ", Position " + pos); } } // This code is contributed by mits
PHP
<?php // PHP program to find position // of only set bit in a given number function Log2n($n) { return ($n > 1) ? 1 + Log2n($n / 2) : 0; } function isPowerOfTwo($n) { return $n && (! ($n & ($n - 1))); } function findPosition($n) { if (!isPowerOfTwo($n)) return -1; return Log2n($n) + 1; } // Driver Code $n = 0; $pos = findPosition($n); if(($pos == -1) == true) echo "n =", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position n", $pos, "\n"; $n = 12; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n =", $n, ", ", " Position", $pos, "\n"; // Driver Code $n = 128; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ", ", " Invalid number", "\n"; else echo "n = ", $n, ", ", " Position ", $pos, "\n"; // This code is contributed by aj_36 ?>
Javascript
<script> // JavaScript program to find position // of only set bit in a given number function Log2n(n){ if (n > 1) return (1 + Log2n(n / 2)) else return 0 } // A utility function to check // whether n is power of 2 or not function isPowerOfTwo(n){ return n && ( ! (n & (n-1)) ) } function findPosition(n){ if (isPowerOfTwo(n) == false) return -1 return Log2n(n) + 1 } // Driver program to test above function var n = 0 var pos = findPosition(n) if(pos == -1) document.write("n = ", n, ", Invalid number") else document.write("n = ", n, ", Position ", pos) document.write("<br>") n = 12 pos = findPosition(n) if(pos == -1) document.write("n = ", n, ", Invalid number") else document.write("n = ", n, ", Position ", pos) document.write("<br>") n = 128 pos = findPosition(n) if(pos == -1) document.write("n = ", n, ", Invalid number") else document.write("n = ", n, ", Position ", pos) // This code is contributed AnkThon </script>
Producción :
n = 0, Invalid number n = 12, Invalid number n = 128, Position 8
Complejidad del tiempo: O(log 2 n)
Complejidad espacial: O(log 2 n)
Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA