2807: 【例45.3】 寻找最低数

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:14 解决:10

题目描述

给你一个正整数$A$($1≤A≤2.1×10^9$),输出$A$的最低数。
例如,给你 $A=26$,我们可以将$A$化成二进制为 $11010$ ,则$A$ 的最低数是 $10$,输出 $10$ 的十进制为 $2$。
再例如,给你 $A=88$,我们可以将$A$化成二进制为 $1011000$,则$A$的最低数是$1000$,输出为$8$。

输入

输入包含多组测试样例。每行输入一个正整数$A$($1≤A≤2.1×10^9$)。当输入 $0$ 时,输入结束。

输出

对于每一个输入,输出对应的最低数。

样例输入 复制

26
88
0

样例输出 复制

2
8

提示

根据计算机的补码的性质,补码等于原码的反码+1

-x = ~x + 1

例子:

x  = (9)10               =       0000 1001

-x = 1111 0110 + 1 = 1111 0111

再做与操作,得0000 0001,这样就得到答案是1

x  = (26)10          =       0001 1010

-x = 1110 0101 + 1 = 1110 0110

再做与操作,得0000 0010,这样就得到2

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
    while(cin>>n){
        if(n==0) break;
        cout<<(n&(-n))<<endl;
    }
    return 0;
}