/************************************************************************* > 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 ",1<<count); //count = 0; printf("%d ",((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))