给定两个非负数a和b以及两个值l和r 。问题是要检查两个给定数字中在l到r范围内对应位置的所有位是否彼此互补。
这些位从右到左编号,即,最低有效位被认为在第一位置。
例子:
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中所有位是否都设置在l到r的范围内。请参阅这篇文章。
下面是上述方法的实现。
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