给定一个非负整数n 。的问题是由1通过操纵n的位的n个递增。
例子 :
Input : 6
Output : 7
Input : 15
Output : 16
方法:以下是步骤:
- 获取n的最右边未设置位的位置。将此位置设为k 。
- 设置n的第k位。
- 肘节n的最后k-1个比特。
- 最后,返回n 。
C++
// C++ implementation to increment a number
// by one by manipulating the bits
#include
using namespace std;
// function to find the position
// of rightmost set bit
int getPosOfRightmostSetBit(int n)
{
return log2(n & -n);
}
// function to toggle the last m bits
unsigned int toggleLastKBits(unsigned int n,
unsigned int k)
{
// calculating a number 'num' having 'm' bits
// and all are set
unsigned int num = (1 << k) - 1;
// toggle the last m bits and return the number
return (n ^ num);
}
// function to increment a number by one
// by manipulating the bits
unsigned int incrementByOne(unsigned int n)
{
// get position of rightmost unset bit
// if all bits of 'n' are set, then the
// bit left to the MSB is the rightmost
// unset bit
int k = getPosOfRightmostSetBit(~n);
// kth bit of n is being set by this operation
n = ((1 << k) | n);
// from the right toggle all the bits before the
// k-th bit
if (k != 0)
n = toggleLastKBits(n, k);
// required number
return n;
}
// Driver program to test above
int main()
{
unsigned int n = 15;
cout << incrementByOne(n);
return 0;
}
Java
// Java implementation to increment a number
// by one by manipulating the bits
import java.io.*;
import java.util.*;
class GFG {
// function to find the position
// of rightmost set bit
static int getPosOfRightmostSetBit(int n)
{
return (int)(Math.log(n & -n) / Math.log(2));
}
// function to toggle the last m bits
static int toggleLastKBits( int n, int k)
{
// calculating a number 'num' having
// 'm' bits and all are set
int num = (1 << k) - 1;
// toggle the last m bits and return
// the number
return (n ^ num);
}
// function to increment a number by one
// by manipulating the bits
static int incrementByOne( int n)
{
// get position of rightmost unset bit
// if all bits of 'n' are set, then the
// bit left to the MSB is the rightmost
// unset bit
int k = getPosOfRightmostSetBit(~n);
// kth bit of n is being set
// by this operation
n = ((1 << k) | n);
// from the right toggle all
// the bits before the k-th bit
if (k != 0)
n = toggleLastKBits(n, k);
// required number
return n;
}
// Driver Program
public static void main (String[] args)
{
int n = 15;
System.out.println(incrementByOne(n));
}
}
// This code is contributed by Gitanjali.
Python 3
# python 3 implementation
# to increment a number
# by one by manipulating
# the bits
import math
# function to find the
# position of rightmost
# set bit
def getPosOfRightmostSetBit(n) :
return math.log2(n & -n)
# function to toggle the last m bits
def toggleLastKBits(n, k) :
# calculating a number
# 'num' having 'm' bits
# and all are set
num = (1 << (int)(k)) - 1
# toggle the last m bits and
# return the number
return (n ^ num)
# function to increment
# a number by one by
# manipulating the bits
def incrementByOne(n) :
# get position of rightmost
# unset bit if all bits of
# 'n' are set, then the bit
# left to the MSB is the
# rightmost unset bit
k = getPosOfRightmostSetBit(~n)
# kth bit of n is being
# set by this operation
n = ((1 << (int)(k)) | n)
# from the right toggle
# all the bits before the
# k-th bit
if (k != 0) :
n = toggleLastKBits(n, k)
# required number
return n
# Driver program
n = 15
print(incrementByOne(n))
# This code is contributed
# by Nikita Tiwari.
C#
// C# implementation to increment a number
// by one by manipulating the bits
using System;
class GFG {
// function to find the position
// of rightmost set bit
static int getPosOfRightmostSetBit(int n)
{
return (int)(Math.Log(n & -n) / Math.Log(2));
}
// function to toggle the last m bits
static int toggleLastKBits( int n, int k)
{
// calculating a number 'num' having
// 'm' bits and all are set
int num = (1 << k) - 1;
// toggle the last m bits and return
// the number
return (n ^ num);
}
// function to increment a number by one
// by manipulating the bits
static int incrementByOne( int n)
{
// get position of rightmost unset bit
// if all bits of 'n' are set, then the
// bit left to the MSB is the rightmost
// unset bit
int k = getPosOfRightmostSetBit(~n);
// kth bit of n is being set
// by this operation
n = ((1 << k) | n);
// from the right toggle all
// the bits before the k-th bit
if (k != 0)
n = toggleLastKBits(n, k);
// required number
return n;
}
// Driver Program
public static void Main ()
{
int n = 15;
Console.WriteLine(incrementByOne(n));
}
}
// This code is contributed by Sam007.
PHP
Javascript
输出 :
16