对于一个十进制的数字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