/*************************************************************************
> File Name : hdu1196.c
> Author : niwenxian AMS/ICT/CAS
> Mail : niwenxianq@qq.com
> Created Time : 2013年10月30日 星期三 11时50分37秒
> Version :
> Description:
************************************************************************/
//
//Lowest Bit
//
//Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
//Total Submission(s): 6642 Accepted Submission(s): 4866
//
//
//Problem Description
//Given an positive integer A (1 <= A <= 100), output the lowest bit of A.
//
//For example, given A = 26, we can write A in binary form as 11010, so the lowest bit of A is 10, so the output should be 2.
//
//Another example goes like this: given A = 88, we can write A in binary form as 1011000, so the lowest bit of A is 1000, so the output should be 8.
//
//
//Input
//Each line of input contains only an integer A (1 <= A <= 100). A line containing "0" indicates the end of input, and this line is not a part of the input data.
//
//
//Output
//For each A in the input, output a line containing only its lowest bit.
//
//
//Sample Input
//26
//88
//0
//
//
//Sample Output
//2
//8
//
//
//Author
//SHI, Xiaohan
//
//
//Source
//Zhejiang University Local Contest 2005
#include<stdio.h>
#include<math.h>
int main()
{
int a;
// int low_bit;
int count = 0;
while(scanf("%d",&a)!=EOF&&a!=0)
{
//while(a%2 == 0)
//{
// a /= 2;
// count++;
//}
//printf("%d\n",1<<count);
//count = 0;
printf("%d\n",((a^(a-1))+1)>>1);
}
return 0;
}
求最低位1,最基本的方法就是遍历了,从低到高判断,时间比较多
说明:
1. 较巧的方法:
int a;
(a^(a-1)) + 1 就是最低位的前一位的2次方,不过还要移一位
2. 还有就是+的优先级比^的高
3. a&(a-1)结果是把最低位的1清0了,每调用一次就清一个1
这样,把最终结果再异或一次就是了
a ^ (a & (a -1))