Increment a number by one by manipulating the bits
Last Updated :
15 Jun, 2022
Given a non-negative integer n. The problem is to increment n by 1 by manipulating the bits of n.
Examples :
Input : 6
Output : 7
Input : 15
Output : 16
Approach: Following are the steps:
- Get the position of rightmost unset bit of n. Let this position be k.
- Set the k-th bit of n.
- Toggle the last k-1 bits of n.
- Finally, return n.
C++
#include <bits/stdc++.h>
using namespace std;
int getPosOfRightmostSetBit( int n)
{
return log2(n & -n);
}
unsigned int toggleLastKBits(unsigned int n,
unsigned int k)
{
unsigned int num = (1 << k) - 1;
return (n ^ num);
}
unsigned int incrementByOne(unsigned int n)
{
int k = getPosOfRightmostSetBit(~n);
n = ((1 << k) | n);
if (k != 0)
n = toggleLastKBits(n, k);
return n;
}
int main()
{
unsigned int n = 15;
cout << incrementByOne(n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int getPosOfRightmostSetBit( int n)
{
return ( int )(Math.log(n & -n) / Math.log( 2 ));
}
static int toggleLastKBits( int n, int k)
{
int num = ( 1 << k) - 1 ;
return (n ^ num);
}
static int incrementByOne( int n)
{
int k = getPosOfRightmostSetBit(~n);
n = (( 1 << k) | n);
if (k != 0 )
n = toggleLastKBits(n, k);
return n;
}
public static void main (String[] args)
{
int n = 15 ;
System.out.println(incrementByOne(n));
}
}
|
Python 3
import math
def getPosOfRightmostSetBit(n) :
return math.log2(n & - n)
def toggleLastKBits(n, k) :
num = ( 1 << ( int )(k)) - 1
return (n ^ num)
def incrementByOne(n) :
k = getPosOfRightmostSetBit(~n)
n = (( 1 << ( int )(k)) | n)
if (k ! = 0 ) :
n = toggleLastKBits(n, k)
return n
n = 15
print (incrementByOne(n))
|
C#
using System;
class GFG {
static int getPosOfRightmostSetBit( int n)
{
return ( int )(Math.Log(n & -n) / Math.Log(2));
}
static int toggleLastKBits( int n, int k)
{
int num = (1 << k) - 1;
return (n ^ num);
}
static int incrementByOne( int n)
{
int k = getPosOfRightmostSetBit(~n);
n = ((1 << k) | n);
if (k != 0)
n = toggleLastKBits(n, k);
return n;
}
public static void Main ()
{
int n = 15;
Console.WriteLine(incrementByOne(n));
}
}
|
PHP
<?php
function getPosOfRightmostSetBit( $n )
{
$t = $n & - $n ;
return log( $t , 2);
}
function toggleLastKBits( $n , $k )
{
$num = (1 << $k ) - 1;
return ( $n ^ $num );
}
function incrementByOne( $n )
{
$k = getPosOfRightmostSetBit(~ $n );
$n = ((1 << $k ) | $n );
if ( $k != 0)
$n = toggleLastKBits( $n , $k );
return $n ;
}
$n = 15;
echo incrementByOne( $n );
?>
|
Javascript
<script>
function getPosOfRightmostSetBit(n)
{
return (Math.log(n & -n) / Math.log(2));
}
function toggleLastKBits(n, k)
{
let num = (1 << k) - 1;
return (n ^ num);
}
function incrementByOne(n)
{
let k = getPosOfRightmostSetBit(~n);
n = ((1 << k) | n);
if (k != 0)
n = toggleLastKBits(n, k);
return n;
}
let n = 15;
document.write(incrementByOne(n));
</script>
|
Output :
16
Time Complexity: O(1)
Space Complexity: O(1)
Share your thoughts in the comments
Please Login to comment...