描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例1
输入:5
输出:2
示例2
输入:0
输出:0
思路
- 看见涉及整数在内存中的存储模型,第一反应就是使用位移运算符。
代码
IntegerSpliteCounter.h
#pragma once
#include <mutex>
class IntegerSpliteCounter
{
public:
static IntegerSpliteCounter* getInstance();
public:
void count();
private:
IntegerSpliteCounter() = default;
~IntegerSpliteCounter() = default;
private:
static IntegerSpliteCounter* instance;
static std::mutex iMutex;
};
IntegerSpliteCounter.cpp
#include <iostream>
#include "IntegerSpliteCounter.h"
IntegerSpliteCounter* IntegerSpliteCounter::instance = nullptr;
std::mutex IntegerSpliteCounter::iMutex;
IntegerSpliteCounter* IntegerSpliteCounter::getInstance()
{
std::unique_lock<std::mutex> lock(iMutex);
if (nullptr == instance) {
instance = new IntegerSpliteCounter();
}
return instance;
}
void IntegerSpliteCounter::count()
{
uint32_t number = 0;
std::cin >> number;
uint32_t count = 0;
uint32_t shiftCount = 31;
while (shiftCount--) {
count += ((0x1 << shiftCount) & number) >> shiftCount ;
}
std::cout << count << std::endl;
}
main.cpp
#include "IntegerSpliteCounter.h"
int main(int argc, char** argv)
{
auto counter = IntegerSpliteCounter::getInstance();
counter->count();
return 0;
}