仅含置位位的最小整数

给你一个正整数 n

返回 大于等于 n 且二进制表示仅包含 置位 位的 最小 整数 x 。

置位 位指的是二进制表示中值为 1 的位。

示例 1:

输入: n = 5

输出: 7

解释:

7 的二进制表示是 "111"

示例 2:

输入: n = 10

输出: 15

解释:

15 的二进制表示是 "1111"

示例 3:

输入: n = 3

输出: 3

解释:

3 的二进制表示是 "11"

提示:

  • 1 <= n <= 1000

思路

首先找到这个数的二进制位数,然后把不为1的位变成1就行了
bit_width 函数可以找到一个数的位数,但是bit_width() 函数只接受无符号整数类型作为参数,不接受有符号整数。如果 n 是 int 类型(有符号),直接调用 bit_width(n) 会编译错误。

然后找到大于这个数的最大的2的指数,再减一就行了。

代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {

public:

    int smallestNumber(int n) {

        return (1 << bit_width((uint32_t) n)) - 1;

    }

};