Given an integer ‘x’, write a C function that returns true if binary representation of x is palindrome else return false.
For example a numbers with binary representation as 10..01 is palindrome and number with binary representation as 10..00 is not palindrome.
The idea is similar to checking a string is palindrome or not. We start from leftmost and rightmost bits and compare bits one by one. If we find a mismatch, then return false.
Method#1: We follow the following logic to check binary of number is Palindrome or not:
- Find number of bits in x using sizeof() operator.
- Initialize left and right positions as 1 and n respectively.
- Do following while left ‘l’ is smaller than right ‘r’.
- If bit at position ‘l’ is not same as bit at position ‘r’, then return false.
- Increment ‘l’ and decrement ‘r’, i.e., do l++ and r–-.
- If we reach here, it means we didn’t find a mismatching bit.
- To find the bit at a given position, we can use the idea similar to this post. The expression “x & (1 << (k-1))” gives us non-zero value if bit at k’th position from right is set and gives a zero value if if k’th bit is not set.
Following is the implementation of the above algorithm.
C++
#include<iostream>
using namespace std;
bool isKthBitSet(unsigned int x, unsigned int k)
{
return (x & (1 << (k - 1))) ? true : false ;
}
bool isPalindrome(unsigned int x)
{
int l = 1;
int r = sizeof (unsigned int ) * 8;
while (l < r)
{
if (isKthBitSet(x, l) != isKthBitSet(x, r))
return false ;
l++; r--;
}
return true ;
}
int main()
{
unsigned int x = 1 << 15 + 1 << 16;
cout << isPalindrome(x) << endl;
x = 1 << 31 + 1;
cout << isPalindrome(x) << endl;
return 0;
}
|
Java
class GFG
{
static int isKthBitSet( long x, long k)
{
int rslt = ((x & ( 1 << (k - 1 ))) != 0 ) ? 1 : 0 ;
return rslt;
}
static int isPalindrome( long x)
{
long l = 1 ;
long r = (Integer.SIZE/ 8 )* 8 ;
while (l < r)
{
if (isKthBitSet(x, l) != isKthBitSet(x, r))
{
return 0 ;
}
l++; r--;
}
return 1 ;
}
public static void main (String[] args)
{
long x = 1 << 15 + 1 << 16 ;
System.out.println(isPalindrome(x));
x = ( 1 << 31 ) + 1 ;
System.out.println(isPalindrome(x));
}
}
|
Python3
import sys
def isKthBitSet(x, k):
if ((x & ( 1 << (k - 1 ))) ! = 0 ):
return True
else :
return False
def isPalindrome(x):
l = 1
r = 2 * 8
while (l < r):
if (isKthBitSet(x, l) ! = isKthBitSet(x, r)):
return False
l + = 1
r - = 1
return True
if __name__ = = '__main__' :
x = 1 << 15 + 1 << 16
print ( int (isPalindrome(x)))
x = 1 << 31 + 1
print ( int (isPalindrome(x)))
|
C#
using System;
class GFG
{
static int isKthBitSet( long x, long k)
{
int rslt = ((x & (1 << ( int )(k - 1))) != 0) ? 1 : 0;
return rslt;
}
static int isPalindrome( long x)
{
long l = 1;
long r = 4 * 8;
while (l < r)
{
if (isKthBitSet(x, l) != isKthBitSet(x, r))
{
return 0;
}
l++; r--;
}
return 1;
}
public static void Main ()
{
long x = 1 << 15 + 1 << 16 ;
Console.WriteLine(isPalindrome(x));
x = (1 << 31) + 1 ;
Console.WriteLine(isPalindrome(x));
}
}
|
PHP
<?php
function isKthBitSet( $x , $k )
{
return ( $x & (1 << ( $k - 1))) ? true : false;
}
function isPalindrome( $x )
{
$l = 1;
$r = sizeof(4) * 8;
while ( $l < $r )
{
if (isKthBitSet( $x , $l ) != isKthBitSet( $x , $r ))
return false;
$l ++;
$r --;
}
return true;
}
$x = 1 << 15 + 1 << 16;
echo isPalindrome( $x ), "\n" ;
$x = 1 << 31 + 1;
echo isPalindrome( $x ), "\n" ;
?>
|
Javascript
<script>
function isKthBitSet(x, k)
{
let rslt = ((x & (1 << (k - 1))) != 0) ? 1 : 0;
return rslt;
}
function isPalindrome(x)
{
let l = 1;
let r = 4 * 8;
while (l < r)
{
if (isKthBitSet(x, l) !=
isKthBitSet(x, r))
{
return 0;
}
l++; r--;
}
return 1;
}
let x = 1 << 15 + 1 << 16;
document.write(isPalindrome(x) + "</br>" );
x = (1 << 31) + 1;
document.write(isPalindrome(x));
</script>
|
Output:
1
1
Time Complexity: O(x)
Auxiliary Space: O(1)
Method#2: Using reverse() function:
- When user inputs an integer, it is passed to method which will evaluate the result.
- Actual logic inside the method focuses on following:
- It first convert the integer to binary form of integer in string format.
- It reverse the string using reverse method.
- It is palindrome if both the string is equal else not.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string bin(unsigned n)
{ string ans;
while (n > 0){
ans = (to_string(n&1)) + ans;
n >>= 1;
}
return ans;
}
bool checkPalindrome( unsigned int n){
string s1 = bin(n);
string s2 = s1;
reverse(s2.begin(), s2.end());
return s1 == s2;
}
int main() {
unsigned int x = 1 << 15 + 1 << 16;
cout << checkPalindrome(x) << endl;
x = 10;
cout << checkPalindrome(x) << endl;
return 0;
}
|
Java
class GFG
{
static String bin( int n)
{
String ans = "" ;
while (n > 0 ){
ans = (Integer.toString(n& 1 )) + ans;
n >>= 1 ;
}
return ans;
}
static int checkPalindrome( int n){
String s1 = bin(n);
StringBuilder s2 = new StringBuilder(s1);
s2 = s2.reverse();
return s1.equals(s2.toString()) ? 1 : 0 ;
}
public static void main(String[] args) {
int x = 9 ;
System.out.println(checkPalindrome(x));
x = 10 ;
System.out.println(checkPalindrome(x));
}
}
|
Python
def bin (n):
ans = "";
while n > 0 :
ans = ( str (n& 1 )) + ans;
n >> = 1 ;
return ans;
def checkPalindrome(x):
s1 = bin (x)
s2 = s1[:: - 1 ]
return 1 if s1 = = s2 else 0
x = 9 ;
print (checkPalindrome(x))
x = 10
print (checkPalindrome(x))
|
C#
using System;
public class GFG
{
static string bin( int n)
{
string ans = "" ;
while (n > 0) {
ans = (Convert.ToString(n & 1)) + ans;
n >>= 1;
}
return ans;
}
static int checkPalindrome( int n)
{
string s1 = bin(n);
char [] charArray = s1.ToCharArray();
Array.Reverse(charArray);
string s2 = new string (charArray);
return s1.Equals(s2) ? 1 : 0;
}
public static void Main( string [] args)
{
int x = 9;
Console.WriteLine(checkPalindrome(x));
x = 10;
Console.WriteLine(checkPalindrome(x));
}
}
|
Javascript
function bin(n)
{ let ans= "" ;
while (n > 0){
ans = ((n&1).toString()) + ans;
n >>= 1;
}
return ans;
}
function checkPalindrome(x){
let s1 = bin(x);
let s2 = s1.split( "" ).reverse().join( "" );
return s1 === s2 ? 1 :0;
}
let x = 1 << 15 + 1 << 16 ;
console.log(checkPalindrome(x));
x = 10;
console.log(checkPalindrome(x));
|
Time Complexity: O(log(x))
Auxiliary Space: O(1)
This article is contributed by Saurabh Gupta. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.