hdu1196

/*************************************************************************
	>    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))


每天早上叫醒你的不是闹钟,而是心中的梦~
原文地址:https://www.cnblogs.com/vintion/p/4117036.html