📜  查找数字的最高有效位

📅  最后修改于: 2021-04-27 23:31:14             🧑  作者: Mango

给定一个数字,找到小于给定数字(是2的幂)的最大数字,或者找到最高有效位数。
例子:

Input : 10
Output : 8
Greatest number which is a Power of 2 less than 10 is 8
Binary representation of 10 is 1010
The most significant bit corresponds
to decimal number 8.

Input : 18
Output : 16 

一个简单的解决方案是将n除以2直到其变为0,并在执行此操作时增加计数。该计数实际上代表了MSB的位置。

C++
// Simple CPP program to find MSB number
// for given n.
#include 
using namespace std;
 
int setBitNumber(int n)
{
    if (n == 0)
        return 0;
 
    int msb = 0;
    n = n / 2;
    while (n != 0) {
        n = n / 2;
        msb++;
    }
 
    return (1 << msb);
}
 
// Driver code
int main()
{
    int n = 0;
    cout << setBitNumber(n);
    return 0;
}


Java
// Simple Java rogram to find
// MSB number for given n.
import java.io.*;
 
class GFG {
    static int setBitNumber(int n)
    {
        if (n == 0)
            return 0;
 
        int msb = 0;
        n = n / 2;
 
        while (n != 0) {
            n = n / 2;
            msb++;
        }
 
        return (1 << msb);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 0;
        System.out.println(setBitNumber(n));
    }
}
 
// This code is contributed by ajit


Python3
# Simple Python3 program
# to find MSB number
# for given n.
def setBitNumber(n):
    if (n == 0):
        return 0;
 
    msb = 0;
    n = int(n / 2);
 
    while (n > 0):
        n = int(n / 2);
        msb += 1;
 
    return (1 << msb);
 
# Driver code
n = 0;
print(setBitNumber(n));
     
# This code is contributed
# by mits


C#
// Simple C# rogram to find
// MSB number for given n.
using System;
 
class GFG {
    static int setBitNumber(int n)
    {
        if (n == 0)
            return 0;
 
        int msb = 0;
        n = n / 2;
 
        while (n != 0) {
            n = n / 2;
            msb++;
        }
 
        return (1 << msb);
    }
 
    // Driver code
    static public void Main()
    {
        int n = 0;
        Console.WriteLine(setBitNumber(n));
    }
}
 
// This code is contributed
// by akt_mit


PHP


Javascript


C++
// CPP program to find MSB number for given n.
#include 
using namespace std;
 
int setBitNumber(int n)
{
    // Below steps set bits after
    // MSB (including MSB)
 
    // Suppose n is 273 (binary
    // is 100010001). It does following
    // 100010001 | 010001000 = 110011001
    n |= n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set. It does following
    // 110011001 | 001100110 = 111111111
    n |= n >> 2;
 
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
 
    // Increment n by 1 so that
    // there is only one set bit
    // which is just before original
    // MSB. n now becomes 1000000000
    n = n + 1;
 
    // Return original MSB after shifting.
    // n now becomes 100000000
    return (n >> 1);
}
 
// Driver code
int main()
{
    int n = 273;
    cout << setBitNumber(n);
    return 0;
}


Java
// Java program to find MSB
// number for given n.
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // Below steps set bits after
        // MSB (including MSB)
 
        // Suppose n is 273 (binary
        // is 100010001). It does following
        // 100010001 | 010001000 = 110011001
        n |= n >> 1;
 
        // This makes sure 4 bits
        // (From MSB and including MSB)
        // are set. It does following
        // 110011001 | 001100110 = 111111111
        n |= n >> 2;
 
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
 
        // Increment n by 1 so that
        // there is only one set bit
        // which is just before original
        // MSB. n now becomes 1000000000
        n = n + 1;
 
        // Return original MSB after shifting.
        // n now becomes 100000000
        return (n >> 1);
    }
 
    // Driver code
    public static void main(String arg[])
    {
        int n = 273;
        System.out.print(setBitNumber(n));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python program to find
# MSB number for given n.
 
def setBitNumber(n):
 
    # Below steps set bits after
    # MSB (including MSB)
  
    # Suppose n is 273 (binary
    # is 100010001). It does following
    # 100010001 | 010001000 = 110011001
    n |= n>>1
  
    # This makes sure 4 bits
    # (From MSB and including MSB)
    # are set. It does following
    # 110011001 | 001100110 = 111111111
    n |= n>>2  
  
    n |= n>>4 
    n |= n>>8
    n |= n>>16
      
    # Increment n by 1 so that
    # there is only one set bit
    # which is just before original
    # MSB. n now becomes 1000000000
    n = n + 1
  
    # Return original MSB after shifting.
    # n now becomes 100000000
    return (n >> 1)
 
# Driver code
 
n = 273           
print(setBitNumber(n))
 
# This code is contributed
# by Anant Agarwal.


C#
// C# program to find MSB number for given n.
using System;
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // Below steps set bits after
        // MSB (including MSB)
 
        // Suppose n is 273 (binary
        // is 100010001). It does following
        // 100010001 | 010001000 = 110011001
        n |= n >> 1;
 
        // This makes sure 4 bits
        // (From MSB and including MSB)
        // are set. It does following
        // 110011001 | 001100110 = 111111111
        n |= n >> 2;
 
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
 
        // Increment n by 1 so that
        // there is only one set bit
        // which is just before original
        // MSB. n now becomes 1000000000
        n = n + 1;
 
        // Return original MSB after shifting.
        // n now becomes 100000000
        return (n >> 1);
    }
 
    // Driver code
    public static void Main()
    {
        int n = 273;
        Console.WriteLine(setBitNumber(n));
    }
}
 
// This code is contributed by Sam007.


PHP
> 1;
 
    // This makes sure 4 bits
    // (From MSB and including
    // MSB) are set. It does
    // following 110011001 |
    // 001100110 = 111111111
    $n |= $n >> 2;
 
    $n |= $n >> 4;
    $n |= $n >> 8;
    $n |= $n >> 16;
 
    // Increment n by 1 so
    // that there is only
    // one set bit which is
    // just before original
    // MSB. n now becomes
    // 1000000000
    $n = $n + 1;
 
    // Return original MSB
    // after shifting. n
    // now becomes 100000000
    return ($n >> 1);
}
 
// Driver code
$n = 273;
echo setBitNumber($n);
 
// This code is contributed
// by akt_mit
?>


C++
// CPP program to find MSB
// number for given n.
#include 
using namespace std;
 
int setBitNumber(int n)
{
 
    // To find the position
    // of the most significant
    // set bit
    int k = (int)(log2(n));
 
    // To return the the value
    // of the number with set
    // bit at k-th position
    return 1 << k;
}
 
// Driver code
int main()
{
    int n = 273;
    cout << setBitNumber(n);
    return 0;
}


Java
// Java program to find MSB
// number for given n.
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // To find the position of the
        // most significant set bit
        int k = (int)(Math.log(n) / Math.log(2));
 
        // To return the the value of the number
        // with set bit at k-th position
        return 1 << k;
    }
 
    // Driver code
    public static void main(String arg[])
    {
        int n = 273;
        System.out.print(setBitNumber(n));
    }
}


Python3
# Python program to find
# MSB number for given n.
import math
 
def setBitNumber(n):
     
    # To find the position of
    # the most significant
    # set bit
    k = int(math.log(n, 2))
     
    # To return the value
    # of the number with set
    # bit at k-th position
    return 1 << k
 
# Driver code
n = 273       
print(setBitNumber(n))


C#
// C# program to find MSB
// number for given n.
using System;
 
public class GFG {
 
    static int setBitNumber(int n)
    {
 
        // To find the position of the
        // most significant set bit
        int k = (int)(Math.Log(n) / Math.Log(2));
 
        // To return the the value of the number
        // with set bit at k-th position
        return 1 << k;
    }
 
    // Driver code
    static public void Main()
    {
        int n = 273;
        Console.WriteLine(setBitNumber(n));
    }
}


PHP


输出:
0

对于固定大小的整数(例如32位)的有效解决方案是将一位设置为1位,然后加1,以便仅设置MSB之后的位。最后右移1并返回答案。该解决方案不需要任何条件检查。

C++

// CPP program to find MSB number for given n.
#include 
using namespace std;
 
int setBitNumber(int n)
{
    // Below steps set bits after
    // MSB (including MSB)
 
    // Suppose n is 273 (binary
    // is 100010001). It does following
    // 100010001 | 010001000 = 110011001
    n |= n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set. It does following
    // 110011001 | 001100110 = 111111111
    n |= n >> 2;
 
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
 
    // Increment n by 1 so that
    // there is only one set bit
    // which is just before original
    // MSB. n now becomes 1000000000
    n = n + 1;
 
    // Return original MSB after shifting.
    // n now becomes 100000000
    return (n >> 1);
}
 
// Driver code
int main()
{
    int n = 273;
    cout << setBitNumber(n);
    return 0;
}

Java

// Java program to find MSB
// number for given n.
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // Below steps set bits after
        // MSB (including MSB)
 
        // Suppose n is 273 (binary
        // is 100010001). It does following
        // 100010001 | 010001000 = 110011001
        n |= n >> 1;
 
        // This makes sure 4 bits
        // (From MSB and including MSB)
        // are set. It does following
        // 110011001 | 001100110 = 111111111
        n |= n >> 2;
 
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
 
        // Increment n by 1 so that
        // there is only one set bit
        // which is just before original
        // MSB. n now becomes 1000000000
        n = n + 1;
 
        // Return original MSB after shifting.
        // n now becomes 100000000
        return (n >> 1);
    }
 
    // Driver code
    public static void main(String arg[])
    {
        int n = 273;
        System.out.print(setBitNumber(n));
    }
}
 
// This code is contributed by Anant Agarwal.

Python3

# Python program to find
# MSB number for given n.
 
def setBitNumber(n):
 
    # Below steps set bits after
    # MSB (including MSB)
  
    # Suppose n is 273 (binary
    # is 100010001). It does following
    # 100010001 | 010001000 = 110011001
    n |= n>>1
  
    # This makes sure 4 bits
    # (From MSB and including MSB)
    # are set. It does following
    # 110011001 | 001100110 = 111111111
    n |= n>>2  
  
    n |= n>>4 
    n |= n>>8
    n |= n>>16
      
    # Increment n by 1 so that
    # there is only one set bit
    # which is just before original
    # MSB. n now becomes 1000000000
    n = n + 1
  
    # Return original MSB after shifting.
    # n now becomes 100000000
    return (n >> 1)
 
# Driver code
 
n = 273           
print(setBitNumber(n))
 
# This code is contributed
# by Anant Agarwal.

C#

// C# program to find MSB number for given n.
using System;
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // Below steps set bits after
        // MSB (including MSB)
 
        // Suppose n is 273 (binary
        // is 100010001). It does following
        // 100010001 | 010001000 = 110011001
        n |= n >> 1;
 
        // This makes sure 4 bits
        // (From MSB and including MSB)
        // are set. It does following
        // 110011001 | 001100110 = 111111111
        n |= n >> 2;
 
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
 
        // Increment n by 1 so that
        // there is only one set bit
        // which is just before original
        // MSB. n now becomes 1000000000
        n = n + 1;
 
        // Return original MSB after shifting.
        // n now becomes 100000000
        return (n >> 1);
    }
 
    // Driver code
    public static void Main()
    {
        int n = 273;
        Console.WriteLine(setBitNumber(n));
    }
}
 
// This code is contributed by Sam007.

的PHP

> 1;
 
    // This makes sure 4 bits
    // (From MSB and including
    // MSB) are set. It does
    // following 110011001 |
    // 001100110 = 111111111
    $n |= $n >> 2;
 
    $n |= $n >> 4;
    $n |= $n >> 8;
    $n |= $n >> 16;
 
    // Increment n by 1 so
    // that there is only
    // one set bit which is
    // just before original
    // MSB. n now becomes
    // 1000000000
    $n = $n + 1;
 
    // Return original MSB
    // after shifting. n
    // now becomes 100000000
    return ($n >> 1);
}
 
// Driver code
$n = 273;
echo setBitNumber($n);
 
// This code is contributed
// by akt_mit
?>
输出:
256

时间复杂度为O(1)。
另一种方法:给定数字n。首先,找到最高有效设置位的位置,然后在第k个位置设置一个设置位来计算数字的值。
感谢Rohit Narayan提出了这种方法。

C++

// CPP program to find MSB
// number for given n.
#include 
using namespace std;
 
int setBitNumber(int n)
{
 
    // To find the position
    // of the most significant
    // set bit
    int k = (int)(log2(n));
 
    // To return the the value
    // of the number with set
    // bit at k-th position
    return 1 << k;
}
 
// Driver code
int main()
{
    int n = 273;
    cout << setBitNumber(n);
    return 0;
}

Java

// Java program to find MSB
// number for given n.
 
class GFG {
 
    static int setBitNumber(int n)
    {
 
        // To find the position of the
        // most significant set bit
        int k = (int)(Math.log(n) / Math.log(2));
 
        // To return the the value of the number
        // with set bit at k-th position
        return 1 << k;
    }
 
    // Driver code
    public static void main(String arg[])
    {
        int n = 273;
        System.out.print(setBitNumber(n));
    }
}

Python3

# Python program to find
# MSB number for given n.
import math
 
def setBitNumber(n):
     
    # To find the position of
    # the most significant
    # set bit
    k = int(math.log(n, 2))
     
    # To return the value
    # of the number with set
    # bit at k-th position
    return 1 << k
 
# Driver code
n = 273       
print(setBitNumber(n))

C#

// C# program to find MSB
// number for given n.
using System;
 
public class GFG {
 
    static int setBitNumber(int n)
    {
 
        // To find the position of the
        // most significant set bit
        int k = (int)(Math.Log(n) / Math.Log(2));
 
        // To return the the value of the number
        // with set bit at k-th position
        return 1 << k;
    }
 
    // Driver code
    static public void Main()
    {
        int n = 273;
        Console.WriteLine(setBitNumber(n));
    }
}

的PHP


输出:
256