How to check whether a number is in the range[low, high] using one comparison ?

22 Jun, 2022
This is simple, but interesting programming puzzle. Given three integers, low, high and x such that high >= low. How to check if x lies in range [low, high] or not using single comparison. For example, if range is [10, 100] and number is 30, then output is true and if the number is 5, then output is false for same range. A simple solution is compare x with low and high 
C++
#include <iostream>using namespace std;   // Returns true if x is in range [low..high], else false   bool inRange(unsigned low, unsigned high, unsigned x)         {          return (low <= x && x <= high);         }         int main()         {          inRange(10, 100, 30)? cout << "Yes\n": cout <<"No\n";          inRange(10, 100, 5)?  cout << "Yes\n": cout <<"No\n";    }
Output: 
Yes
No
 
  The above solution does two comparisons, 
  Can we do the same task using one comparison?  
We strongly recommend you to minimize your browser and try this yourself first.The idea is to compare “x-low” with “high-x”. x is in range [low, high] if and only if x is greater than or equal to low and smaller than or equal to high.  
CPP
#include <iostream>using namespace std; // Returns true if x is in range [low..high], else falsebool inRange(unsigned low, unsigned high, unsigned x){    return  ((x-low) <= (high-low));} int main(){    inRange(10, 100, 30)? cout << "Yes\n":  cout  <<"No\n";    inRange(10, 100, 5)?  cout << "Yes\n":  cout  <<"No\n";}
Output: 
Yes
No
How does this work for [10, 100] and x = 5? When we subtract 10 from 5, we get -5 which is considered as UNIT_MAX-4 in unsigned int form. UNIT_MAX is maximum possible unsigned int value. The assumption here is, numbers are stored in 2’s complement form. In 2’s complement form, -1 represents UINT_MAX, -2 represents UINT_MAX-1,..etc.Thanks to Utkarsh for suggesting this solution. A Solution that works for negative numbers also The idea is to multiply (x-low) and (x-high). If x is in range, then it must be greater than or equal to low, i.e., (x-low) >= 0. And must be smaller than or equal to high i.e., (high – x) <= 0. So if result of the multiplication is less than or equal to 0, then x is in range. Else not. Thanks to eva for suggesting this method. 
CPP
#include <iostream>using namespace std; // Returns true if x is in range [low..high], else falsebool inRange(int low, int high, int x){    return ((x-high)*(x-low) <= 0);} int main(){    inRange(10, 100, 30)? cout << "Yes\n":  cout  <<"No\n";    inRange(10, 100, 5)?  cout << "Yes\n":  cout  <<"No\n";}
Output: 
Yes
No
 Time Complexity: O(1)Auxiliary Space: O(1)
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
jit_t
kalrap615
hasani
cpp-puzzle
C Language
C++
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Substring in C++
Multidimensional Arrays in C / C++
Different Methods to Reverse a String in C++
Left Shift and Right Shift Operators in C/C++
std::string class in C++
Vector in C++ STL
Map in C++ Standard Template Library (STL)
Initialize a vector in C++ (7 different ways)
Set in C++ Standard Template Library (STL)
vector erase() and clear() in C++