对于一个十进制的数字x,将他转化为2进制,他的2进制将由0和1组成,求里面的最后一个1在第几位
标签:
对于一个十进制的数字x,将他转化为2进制,他的2进制将由0和1组成,求里面的最后一个1在第几位
第一行输入T,代表T组数据,
接下来T行,每行输入一个X。
0<T<1e7
0<X<1e9
输入x的2进制中最后一个1在第几位,
不存在输出0
3 0 3 8
0 2 1
思路:就是先二进制的总长度,和从右数(从低位开始的第一个1的位置),然后用总长度减去从右数1的位置为这个1左边有多少位数,然后再加1就是从右数最后一个1
所在的位置了!
代码:
#include <stdio.h> int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); if(n==0)//如果那个数是0的话,它的二进制0,里面没有1,所以输出0! { printf("0\n"); continue;//继续循环! } int t;//用来保存总的二进制数的长度! int k=0;//k用来保存从右数的第一个1的位数(同样也是从左数的最后一个1) int flag=0;//flag用来标记是否找到右数第一个1,如果找到就不再更新k的值! if(n%2==0)//因为如果是偶数的话这样算的二进制的位数会比正常的位数多一,所以就从-1开始! t=-1; else//奇数从0开始! t=0; while(n) { t++; if(n%2==1&&flag==0)//如果找到第一个1,就将他的位数赋值给k,来保存他的从右数的位数! { flag=1;//标记一下,以后的1不用更新k的值! k=t; } n/=2; } printf("%d\n",t-k+1);//总长度减去从右数的值加1就是从左数的位数! } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/dxx_111/article/details/47981941