JD 1513:二进制中1的个数

题目描述:

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

输入:

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

输出:

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

样例输入:
3
4
5
-1
样例输出:
1
2
32
本题正负都有
代码如下:
#include <iostream>
#include <string>
#include <string.h>
#include <map>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <set>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define SWAP(a , b){ int temp = a; a = b; b = temp;}

using namespace std;
int main()
{   int n,k;
    cin >> n;
    while(n--)
    {
        scanf("%d",&k);
        int num = 0;
        /*while(k)//正负皆可
        {
            k &= (k - 1);
            num++;
        }*/
        /*while(k)//只适用于正数
        {
            if(k%2 == 1) num++;

            k = k/2;
        }*/
        while(k)//只适用于正数
        {
            num += k&0x01;
            k >>= 1;
        }
        printf("%d\n",num);
    }
    return 0;
}

扩展问题:
给二进制表示的两个数A,B,将A变成B,至少需要改变多少位?
这是一道位运算的综合题,全面考察了位运算的各种用法和技巧。在实现过程中,尽量只使用位运算的技巧来完成。 给你一个 int 范围内的整数 x x ,然后进行 q q 次操作,每次操作会以 op <a> <b> 的形式输入。操作类型如下几种可能(以下操作均为二进制下操作): ca a:修改,将 x x 的第 a a 位设置为 0 0 ,然后输出 x x ; cb a:修改,将 x x 的第 a a 位设置为 1 1 ,然后输出 x x ; cc a:修改,将 x x 的第 a a 位取反,然后输出 x x ; cd a b:修改,将 x x 的第 a ∼ b a∼b 位清零,然后输出 x x ; ce a b:修改,将 x x 的第 a ∼ b a∼b 位置 1 1 ,然后输出 x x ; cf:修改,将 x x 的所有位都取反,然后输出 x x ; ja a:判定 x x 和 a a 是否同号(同正同负),如果同号,输出 yes,否则输出 no。数据保证 x , a x,a 都不会为 0 0 ; jb a:判定 x x 的第 a a 位是不是 1 1 ,如果是,输出 yes,否则输出 no; jc a:判定 x x 和 a a 做按位与运算后的结果是不是 2 2 的整数次幂,如果是,输出 yes,否则输出 no; jd:判定 x x 中是否存在两个相邻位都为 1 1 的情况,如果存在,输出 yes,否则输出 no。若 x x 是负数,输出 err; ka a:计算,输出 2 ∣ x ∣ m o d a 2 ∣x∣moda 的结果并输出,保证 2 ≤ a ≤ 40 2≤a≤40 ; kb:计算,输出一行一个整数, x x 中 1 1个数,即输出 popcount(x); kc:计算,只保留 x x 的最后一位 1 1 ,其他位清零,即输出 lowbit(x); kd a:计算,只保留 x x 的第 a a 位,其他位清零后输出,保证 0 ≤ a < 32 0≤a<32 ; ke a b: 计算,只保留 x x 的第 a ∼ b a∼b 位构成的数字,其他位清零后输出; 说明: 这里的位运算都是在 int 范围( − 2 32 ∼ 2 311 −2 32 ∼2 311 )下进行的; 数据保证,若 a , b a,b 表示位数,则必满足 0 ≤ a ≤ b < 32 0≤a≤b<32 ,其他情况下,则默认 a a 在 int 范围内; 所有修改操作都会令 x x 的值发生变化,即影响后续的操作,所有的判定和计算操作不改变 x x ; 这里的第 a a 位指二进制下从右往左数的位数,最低位为第 0 0 位; 所有输出都单独占一行,即末尾都有换行。
05-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值