给定一个数字,找到小于给定数字(是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