📌  相关文章
📜  检查L到R范围内两个数字的位是否彼此互补

📅  最后修改于: 2021-04-29 03:24:57             🧑  作者: Mango

给定两个非负数ab以及两个值lr 。问题是要检查两个给定数字中在lr范围内对应位置的所有位是否彼此互补。
这些位从右到左编号,即,最低有效位被认为在第一位置。
例子

Input: a = 10, b = 5
       l = 1, r = 3
Output: Yes
(10)10 = (1010)2
(5)10 = (101)2 = (0101)2
All the bits in the range 1 to 3 are complement of each other.

Input: a = 21, b = 13
       l = 2, r = 4
Output: No
(21)10 = (10101)2
(13)10 = (1101)2 = (1101)2
All the bits in the range 2 to 4 are not complement of each other.

方法:以下是解决问题的步骤

  • 计算xor_value = a ^ b。
  • 检查xor_value中所有位是否都设置在lr的范围内。请参阅这篇文章。

下面是上述方法的实现。

C++
// C++ implementation to check
// whether all the bits in the given range
// of two numbers are complement of each other
#include 
using namespace std;
 
// function to check whether all the bits
// are set in the given range or not
bool allBitsSetInTheGivenRange(unsigned int n,
                               unsigned int l,
                               unsigned int r)
{
    // calculating a number 'num' having 'r'
    // number of bits and bits in the range l
    // to r are the only set bits
    int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
 
    // new number which will only have one or more
    // set bits in the range l to r and nowhere else
    int new_num = n & num;
 
    // if both are equal, then all bits are set
    // in the given range
    if (num == new_num)
        return true;
 
    // else all bits are not set
    return false;
}
 
// function to check whether all the bits in the given range
// of two numbers are complement of each other
bool bitsAreComplement(unsigned int a, unsigned int b,
                       unsigned int l, unsigned int r)
{
    unsigned int xor_value = a ^ b;
    return allBitsSetInTheGivenRange(xor_value, l, r);
}
 
// Driver Code
int main()
{
    unsigned int a = 10, b = 5;
    unsigned int l = 1, r = 3;
 
    if (bitsAreComplement(a, b, l, r))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}


Java
// Java implementation to check
// whether all the bits in the
// given range of two numbers
// are complement of each other
class GFG
{
// function to check whether
// all the bits are set in
// the given range or not
static boolean allBitsSetInTheGivenRange(int n,
                                         int l, int r)
{
    // calculating a number 'num'
    // having 'r' number of bits
    // and bits in the range l
    // to r are the only set bits
    int num = ((1 << r) - 1) ^
              ((1 << (l - 1)) - 1);
 
    // new number which will only
    // have one or more set bits
    // in the range l to r and
    // nowhere else
    int new_num = n & num;
 
    // if both are equal,
    // then all bits are set
    // in the given range
    if (num == new_num)
        return true;
 
    // else all bits are not set
    return false;
}
 
// function to check whether all
// the bits in the given range
// of two numbers are complement
// of each other
static boolean bitsAreComplement(int a, int b,
                                 int l, int r)
{
    int xor_value = a ^ b;
    return allBitsSetInTheGivenRange(xor_value, l, r);
}
 
// Driver Code
public static void main(String []args)
{
    int a = 10, b = 5;
    int l = 1, r = 3;
 
    if (bitsAreComplement(a, b, l, r))
        System.out.println("Yes");
    else
        System.out.println("No");
}
}
 
// This code is contributed by Smitha


Python 3
# Python 3 implementation to check whether
# all the bits in the given range of two
# numbers are complement of each other
 
# function to check whether all the bits
# are set in the given range or not
def allBitsSetInTheGivenRange(n, l, r):
     
    # calculating a number 'num' having 'r'
    # number of bits and bits in the range l
    # to r are the only set bits
    num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1)
 
    # new number which will only have one
    # or more set bits in the range l to r
    # and nowhere else
    new_num = n & num
 
    # if both are equal, then all bits
    # are set in the given range
    if (num == new_num):
        return True
 
    # else all bits are not set
    return False
 
# function to check whether all the bits
# in the given range of two numbers are
# complement of each other
def bitsAreComplement(a, b, l, r):
    xor_value = a ^ b
    return allBitsSetInTheGivenRange(xor_value, l, r)
 
# Driver Code
if __name__ == "__main__":
     
    a = 10
    b = 5
    l = 1
    r = 3
 
    if (bitsAreComplement(a, b, l, r)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by ita_c


C#
// C# implementation to check
// whether all the bits in the
// given range of two numbers
// are complement of each other
using System;
 
class GFG
{
// function to check whether
// all the bits are set in
// the given range or not
static bool allBitsSetInTheGivenRange(int n, int l,
                                      int r)
{
    // calculating a number 'num'
    // having 'r' number of bits
    // and bits in the range l
    // to r are the only set bits
    int num = ((1 << r) - 1) ^
              ((1 << (l - 1)) - 1);
 
    // new number which will only
    // have one or more set bits
    // in the range l to r and
    // nowhere else
    int new_num = n & num;
 
    // if both are equal,
    // then all bits are set
    // in the given range
    if (num == new_num)
        return true;
 
    // else all bits are not set
    return false;
}
 
// function to check whether all
// the bits in the given range
// of two numbers are complement
// of each other
static bool bitsAreComplement(int a, int b,
                              int l, int r)
{
    int xor_value = a ^ b;
    return allBitsSetInTheGivenRange(xor_value, l, r);
}
 
// Driver Code
static public void Main ()
{
    int a = 10, b = 5;
    int l = 1, r = 3;
     
    if (bitsAreComplement(a, b, l, r))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed
// by Ajit Deshpal.


PHP


Javascript


输出:
Yes