计算机内部用二进制来表达所有的值。一个十进制的数字,比如24,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。
现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。
输入格式:
一个整数,在32位的整数可以表达的范围内。
输出格式:
一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。
输入样例:
256
输出样例:
23
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
需要注意两点:首位是符号位,负数的第一位为1;如果像下面的代码用i作乘方与输入比较进行位数确定,i可能超出Int范围,在测试时会显示超时,故i需要用long long形式
#include<stdio.h>
int main()
{
int x;
long long int i = 1; // 作为参考可能会超过int范围,在本程序中可能到 2^31
int cnt = 0;
scanf("%d", &x);
while( x>=i ){
cnt ++; // 记录转化为二进制时会占多少位
i *= 2;
}
cnt = 32 - cnt; // 计算0的个数
if( x<0 ){ // 首位是符号位,负数首位是1
cnt = 0;
}
printf("%d", cnt);
return 0;
}
也可以用除法来确定位数
#include<stdio.h>
int main()
{
int x;
int cnt = 32; // 前导0的个数
scanf("%d", &x);
if( x<0 ) cnt = 0; // 负数首位是1
else{ // 自然数的前导0计算
while( x!=0 ){
x /= 2;
cnt --;
}
}
printf("%d", cnt);
return 0;
}