面试题10:二进制中1的个数

来源:互联网 发布:淘宝联盟返利时间 编辑:程序博客网 时间:2024/06/10 03:28

题目描述:Online Judge

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。

输出:

对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。

样例输入:
345-1
样例输出:
1232

解题思路:

先判断整数二进制表示中最右边是不是1,接着把输入的整数右移以为,直到整个整数变为0为止。


java代码:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StreamTokenizer;public class Problem_10 {public static void main(String[] args) throws IOException {BufferedReader bu = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer str = new StreamTokenizer(bu);//while(str.nextToken() != StreamTokenizer.TT_EOL){str.nextToken();int n =(int) str.nval;int[] input = new int[n];for(int i = 0; i < n; i ++){str.nextToken();input[i] = (int) str.nval;}//end forfor(int i = 0; i < n; i++){int count = 0;int temp = input[i];while(temp != 0){count++;temp = temp&(temp -1);}//end whileSystem.out.println(count);}//}//end while}}
C++代码:

#include <iostream>#include <stdio.h> using namespace std; int main() {    int T;    cin >> T;    int num;    while(T--)    {        scanf("%d", &num);                 int count = 0;        while(num != 0)        {                        ++count;            num &= (num - 1);        }        printf("%d\n", count);    }         return 0;}


C语言:
#include <stdio.h>int getNumber(int test);int main(){    int n,i,test;    while(scanf("%d",&n)!=EOF && n > 0){        for(i=0 ; i<n ; i++){            scanf("%d",&test);            printf("%d\n",getNumber(test));        }    }    return 0;}int getNumber(int test){    int sum = 0,i;    for(i=0;i<32;i++){        sum+= (test&1);        test = test>>1;    }    return sum;}


测试用例:

正数(包括边界值1、0x7FFFFFFF)

负数(包括边界值0x80000000、0xFFFFFFFF)

0。


 体会:
 题目中要注意移位时候的符号问题,负数的时候移位需要特别注意。
 此题主要考察二进制的位运算。






0 0