import
java.io.*;
public
class
GFG {
static
int
greatestKBits(
int
X,
int
K) {
int
set_bit_count = Integer.bitCount(X);
if
(set_bit_count == K)
return
X;
int
ans = -
1
;
int
zero =
0
, one =
0
;
for
(
int
i =
0
; i <
31
; i++) {
if
((X & (
1
<< i)) !=
0
) {
++one;
int
rem = K - set_bit_count +
1
;
if
(set_bit_count < K
&& zero >= K - set_bit_count +
1
&& zero >= rem) {
int
new_ans = X;
new_ans -= (
1
<< i);
for
(
int
j = i -
1
; j >=
0
; j--) {
if
(rem >
0
) {
if
((new_ans & (
1
<< j)) ==
0
)
rem--;
new_ans |= (
1
<< j);
}
}
ans = Math.max(ans, new_ans);
}
else
if
(set_bit_count > K
&& (set_bit_count - one) <= K) {
int
new_ans = X;
rem = K - (set_bit_count - one);
for
(
int
j = i; j >=
0
; j--) {
if
(rem >
0
&& (new_ans & (
1
<< j)) !=
0
) {
rem--;
}
else
{
if
((new_ans & (
1
<< j)) !=
0
)
new_ans -= (
1
<< j);
}
}
ans = Math.max(ans, new_ans);
}
}
else
{
++zero;
}
}
return
ans;
}
public
static
void
main(String[] args) {
int
X =
8
, K =
2
;
System.out.println(greatestKBits(X, K));
X =
9
;
K =
4
;
System.out.println(greatestKBits(X, K));
}
}