论如何计算一个整数的二进制里数字1个数
- 用类似计算十进制数中有多少个1一样的思想,我们采用while循环和模二除二的方法,不过我们都知道,数据在内存里都是以补码的形式储存的,正数的补码和原码相同,大概可以估计这种方法对正数应该是可行的,但是对于负数呢?对于负数此时二进制的最高位为符号位,要让我们的方法一依然有效的话,就不能让编译器知道此时的二进制码表示为有符号的-1,什么意思呢?就是我们需要将最高位的符号位的效果给去除,不难想到,我们可以将此时的-1转置为unsigned_int…(后面的写法就不再说了)
- 那有没有一种全新的方法来解决我们一开始提出的问题呢?
—————————————分割线—————————————————— 2021 / 11 / 26
起初这篇博文是我大一第一次接触算法题,这是LeetCode上的一道题目,LeetCode191.位1的个数,第一次接触到这个题目我还显得很“稚嫩”,没有一点思路,当初写下这篇文章就是想记录我第一次在算法题上获得的成就感,由于自己懒,这篇文章也就没有写完,现在来完善它!
只是一道很简单的位运算题(现在看来hhhhhhhhh
int hammingWeight(uint32_t n) {
// 由于传进来的参数是32位无符号整数,故不需要再进行转换啦
int digits = 0;
int i = 0;
while(i < 32)
{
if( (n >> i++) & 1 == 1)
{
digits++;
}
}
return digits;
}