031 二进制中1的个数(keep it up, 看到这个题刚开始有点蒙)

剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1513

题目描述:

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

输入:

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

输出:

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

样例输入:
3
4
5
-1
样例输出:
1
2
32
正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
-1011
原码:11011
反码:10100 //负数时,反码为原码取反
补码:10101 //负数时,补码为原码取反+1
移码:00101 //原数+10000
计算机中的正负数都用补码表示,知道这点这题就简单了,因为刚开始还在想怎么把负数的补码求出来。。。汗! 代码:
#include <stdio.h>
#include <stdlib.h>
 
int getCount1(int vNumber)
{
    int i     = 32;
    int Count = 0;
 
    while (i--)
    {
        if (vNumber & 0x00000001) ++Count;
        vNumber >>= 1;
    }
 
    return Count;
}
 
int main()
{
    int N;
    int Number;
 
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d", &Number);
        printf("%d\n", getCount1(Number));
    }
 
    //system("pause");
    return 0;
}
 
/**************************************************************
    Problem: 1513
    User: 
    Language: C
    Result: Accepted
    Time:80 ms
    Memory:912 kb
****************************************************************/





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值