先看题目
给你一个数字 n,找到一个最大的 k 值,使其满足以下条件:
n & (n-1)& (n-2)& (n-3) & ...... & (k)=0
(其中 & 为按位与操作)
输入格式
第一行包含一个数字 T ( 1≤T≤3×10^4),表示有 T 组测试数据;
接下来 T 行,每一行包含一个测试数据 n ( 1≤n≤10^9 )
输入样例
3
2
5
17
样例输出
1
3
15
用暴力会超时,要试着找找规律
//不能采用暴力,要找规律
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
//2倍指数增长
for(int i = 1; ; i ++)
{
int x = pow(2, i);
if( x > n)
{
printf("%d\n", x / 2 - 1);
break;
}
}
}
return 0;
}