📜  通过操作位将数字递增1

📅  最后修改于: 2021-05-25 05:48:58             🧑  作者: Mango

给定一个非负整数n 。的问题是由1通过操纵n的位的n个递增。
例子 :

Input : 6
Output : 7

Input : 15
Output : 16

方法:以下是步骤:

  1. 获取n的最右边未设置位的位置。将此位置设为k
  2. 设置n的第k位。
  3. 肘节n的最后k-1个比特。
  4. 最后,返回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