统计整数转换为二进制后含多少个1 的问题
整数右移
但不适用负数,当x为负数时,一直进行右移运算,最终这个数字会编程0XFFFFFFFF,从而陷入死循环
int getNumber(int x)
{
int count = 0;
while(x)
{
count += x & 1;
x >>= 1; //右移
}
}
整数 与 左移的1 相&
int getNumber_1(int x) {
int32_t count = 0;
// unsigned int flag = 1;
while (x) {
if (x & 0x80000000) {
++count;
}
x <<= 1; //左移
}
return count;
}
减1再相&
把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
每次减一相与,都是剔除最右边的1,直到没有1可以剔除。
int getNumber_1(int i)
{
int count = 0;
while (i)
{
++count;
i &= (i - 1);
}
return count;
}
处理二进制的类bitset
头文件
#include<bitset>
bitset是一种类模板,其定义时需要规定对象的位长度
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(s); //b是string对象s中含有的位串的副本
bitset<n> b(s, pos, n); //b是s中从位置pos开始的n个位的副本
string 与 int 湘湖转换
std::to_string()
std::stoi() std::stol std::stoll
本文介绍了统计整数转换为二进制后含有多少个1的方法,包括使用右移、与运算以及减1再与运算的策略。还提到了C++中的`bitset`类以及字符串与整数之间的转换。这些技巧在计算机科学中常用于位操作和二进制数据处理。
1592

被折叠的 条评论
为什么被折叠?



