Count of numbers which can be made power of 2 by given operation

Given a array arr[], the task is to count the numbers which can be made power of 2 with the following operation:
1 can be added to any element atmost once if its not already a power of 2.
Examples:
Input: arr[] = {2, 3, 7, 9, 15}
Output: 4
3, 7 and 15 can be made a power of 2 by adding 1, and 2 is already a power of 2Input: arr[] = {5, 6, 9, 3, 1}
Output: 2
Approach: Traverse the array and check if the current element is a power of 2, if it is then update count = count + 1. If its not a power of 2 then check for one element greater i.e. arr[i] + 1. To check if an element is a power of 2:
- Naive method is to repeatedly divide the element by 2 until it gives either 0 or 1 as the remainder. if the remainder is 1 then its a power of 2 else its not a power of 2.
- Efficient method: If X & (X – 1) = 0 then X is a power of two.
Say, X = 16 = 10000 and X – 1 = 15 = 01111 then X & (X – 1) = 10000 & 01111 = 0 i.e. X = 16 is a power of 2.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function that returns true if x is a power of 2bool isPowerOfTwo(int x){ if (x == 0) return false; // If x & (x-1) = 0 then x is a power of 2 if (!(x & (x - 1))) return true; else return false;}// Function to return the required countint countNum(int a[], int n){ int count = 0; for (int i = 0; i < n; i++) { // If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1)) count++; } return count;}// Driver codeint main(){ int arr[] = { 5, 6, 9, 3, 1 }; int n = sizeof(arr) / sizeof(arr[0]); cout << countNum(arr, n); return 0;} |
Java
// Java implementation of the approachimport java.util.*;class GFG{// Function that returns true if x is a power of 2static boolean isPowerOfTwo(int x){ if (x == 0) return false; // If x & (x-1) = 0 then x is a power of 2 if ((x & (x - 1)) == 0) return true; else return false;}// Function to return the required countstatic int countNum(int a[], int n){ int count = 0; for (int i = 0; i < n; i++) { // If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1)) count++; } return count;}// Driver codepublic static void main(String args[]){ int arr[] = { 5, 6, 9, 3, 1 }; int n = arr.length; System.out.println(countNum(arr, n));}}// This code is contributed by// Sahil_Shelangia |
Python3
# Python 3 implementation of the approach# Function that returns true if x# is a power of 2def isPowerOfTwo(x): if (x == 0): return False # If x & (x-1) = 0 then x is a power of 2 if ((x & (x - 1)) == 0): return True else: return False# Function to return the required countdef countNum(a, n): count = 0 for i in range(0, n, 1): # If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo(a[i]) or isPowerOfTwo(a[i] + 1)): count += 1 return count# Driver codeif __name__ == '__main__': arr = [5, 6, 9, 3, 1] n = len(arr) print(countNum(arr, n))# This code is contributed by# Sanjit_Prasad |
C#
// C# implementation of the approachusing System;class GFG{// Function that returns true if x is a power of 2static bool isPowerOfTwo(int x){ if (x == 0) return false; // If x & (x-1) = 0 then x is a power of 2 if ((x & (x - 1)) == 0) return true; else return false;}// Function to return the required countstatic int countNum(int[] a, int n){ int count = 0; for (int i = 0; i < n; i++) { // If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1)) count++; } return count;}// Driver codepublic static void Main(){ int[] arr = { 5, 6, 9, 3, 1 }; int n = arr.Length; Console.WriteLine(countNum(arr, n));}}// This code is contributed by// Mukul Singh |
PHP
<?php// PHP implementation of the approach// Function that returns true if x is // a power of 2function isPowerOfTwo( $x){ if ($x == 0) return false; // If x & (x-1) = 0 then x is a // power of 2 if (!($x & ($x - 1))) return true; else return false;}// Function to return the required countfunction countNum($a, $n){ $cnt = 0; for ( $i = 0; $i < $n; $i++) { // If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo($a[$i]) || isPowerOfTwo($a[$i] + 1)) $cnt++; } return $cnt;}// Driver Code$arr = array( 5, 6, 9, 3, 1 );$n = count($arr);echo countNum($arr, $n);// This code is contributed by 29AjayKumar?> |
Javascript
<script>// Javascript implementation of the approach // Function that returns true if x is a power of 2function isPowerOfTwo(x){ if (x == 0) return false; // If x & (x-1) = 0 then x is a power of 2 if ((x & (x - 1)) == 0) return true; else return false;}// Function to return the required countfunction countNum(a, n){ let count = 0; for(let i = 0; i < n; i++) { // If a[i] or (a[i]+1) is a power of 2 if (isPowerOfTwo(a[i]) || isPowerOfTwo(a[i] + 1)) count++; } return count;}// Driver codelet arr = [ 5, 6, 9, 3, 1 ];let n = arr.length;document.write(countNum(arr, n));// This code is contributed by unknown2108</script> |
2
Time Complexity: O(n), where n is the size of the given array.
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



