📜  按位或与N之和等于的数字

📅  最后修改于: 2021-05-04 20:41:20             🧑  作者: Mango

给定一个非负整数N,任务是查找非负整数的数量
小于或等于N,其按位OR和与N相等。
例子 :

Input  : N = 3
Output : 1
0 is the only number in [0, 3]
that satisfies given property.
(0 + 3) = (0 | 3)

Input  : 10
Output : 4
(0 + 10) = (0 | 10) (Both are 10)
(1 + 10) = (1 | 10) (Both are 11)
(4 + 10) = (4 | 10) (Both are 14)
(5 + 10) = (5 | 10) (Both are 15)

一个简单的解决方案是遍历从0到N的所有数字,如果两个都是相等的增量计数器,则对它们进行按位OR和SUM运算。
时间复杂度= O(N)。

一个有效的解决方案是遵循以下步骤。
1.在N中找到零位的计数。
2.返回pow(2,count)。

这个想法基于这样一个事实,当且仅当
x与N的按位与将为0

Let, N=10 =10102.
Bitwise AND of a number with N will be 0, if number 
contains zero bit with all respective set bit(s) of
N and either zero bit or set bit with all respective 
zero bit(s) of N (because, 0&0=1&0=0).
  e.g. 
bit     : 1   0   1   0
position: 4   3   2   1
Bitwise AND of any number with N will be 0, if the number
has following bit pattern
1st position can be  either 0 or 1 (2 ways)
2nd position can be  1 (1 way)
3rd position can be  either 0 or 1 (2 ways)
4th position can be  1 (1 way)
Total count = 2*1*2*1 = 22 = 4.

C++
// C++ program to count numbers whose bitwise
// OR and sum with N are equal
#include 
using namespace std;
  
// Function to find total 0 bit in a number
unsigned int CountZeroBit(int n)
{
    unsigned int count = 0;
    while(n)
    { 
       if (!(n & 1))
           count++;
       n >>= 1;
    }
    return count;
}
  
// Function to find Count of non-negative numbers 
// less than or equal to N, whose bitwise OR and 
// SUM with N are equal.
int CountORandSumEqual(int N )
{
    // count number of zero bit in N
    int count = CountZeroBit(N);
  
    // power of 2 to count
    return (1 << count);
}
  
// Driver code
int main()
{
   int N = 10;
   cout << CountORandSumEqual(N);
   return 0;
}


Java
// Java program to count numbers whose bitwise
// OR and sum with N are equal
class GFG {
      
    // Function to find total 0 bit in a number
    static int CountZeroBit(int n)
    {
        int count = 0;
          
        while(n > 0)
        { 
            if ((n & 1) != 0)
                count++;
                  
            n >>= 1;
        }
          
        return count;
    }
      
    // Function to find Count of non-negative 
    // numbers less than or equal to N, whose 
    // bitwise OR and SUM with N are equal.
    static int CountORandSumEqual(int N )
    {
          
        // count number of zero bit in N
        int count = CountZeroBit(N);
      
        // power of 2 to count
        return (1 << count);
    }
      
    //Driver code
    public static void main (String[] args)
    {
          
        int N = 10;
          
        System.out.print(CountORandSumEqual(N));
    }
}
  
// This code is contributed by Anant Agarwal.


Python3
# Python3 program to count numbers whose 
# bitwise OR and sum with N are equal
  
# Function to find total 0 bit in a number
def CountZeroBit(n):
  
    count = 0
    while(n):
      
        if (not(n & 1)):
            count += 1
        n >>= 1
      
    return count
  
# Function to find Count of non-negative  
# numbers less than or equal to N, whose
# bitwise OR and SUM with N are equal.
def CountORandSumEqual(N):
  
    # count number of zero bit in N
    count = CountZeroBit(N)
  
    # power of 2 to count
    return (1 << count)
  
# Driver code
N = 10
print(CountORandSumEqual(N))
  
# This code is contributed by Anant Agarwal.


C#
// C# program to count numbers whose
// bitwise OR and sum with N are equal
using System;
  
class GFG
{
      
    // Function to find total 
    // 0 bit in a number
    static int CountZeroBit(int n)
    {
        int count = 0;
        while(n>0)
        { 
            if (n%2!=0)
            count++;
            n >>= 1;
        }
        return count;
    }
   
    // Function to find Count of non-negative 
    // numbers less than or equal to N, whose
    // bitwise OR and SUM with N are equal.
    static int CountORandSumEqual(int N )
    {
          
    // count number of zero bit in N
    int count = CountZeroBit(N);
   
    // power of 2 to count
    return (1 << count);
    }
      
    //Driver code
    public static void Main()
    {
        int N = 10;
        Console.Write(CountORandSumEqual(N));
    }
}
  
// This code is contributed by Anant Agarwal.


PHP
>= 1;
    }
    return $count;
}
  
// Function to find Count of 
// non-negative numbers less 
// than or equal to N, whose 
// bitwise OR and SUM with N 
// are equal.
  
function CountORandSumEqual($N )
{
    // count number of 
    // zero bit in N
    $count = CountZeroBit($N);
  
    // power of 2 to count
    return (1 << $count);
}
  
// Driver code
$N = 10;
echo CountORandSumEqual($N);
  
// This code is contributed by Ajit
?>


输出 :

4

上述解决方案的总时间复杂度将为O(log 2 (N))。