方法一:利用10进制转换成2进制的步骤
将输入的数依次对2求余,记录结果,再讲输入的数除以2,
最后结果从下往上依次就是2进制的结果
只需要记录当求余等于1的时候的个数
class Solution {
public:
int hammingWeight(uint32_t n) {
if( n == 0 )
return 0;
int count = 0;
while( n != 0 )
{
if(n % 2 == 1)
count++;
n = n >> 1;
}
return count;
}
};
方法二:将这个数不断右移一位一位的去判断
class Solution {
public:
int hammingWeight(uint32_t n) {
if( n == 0 )
return 0;
int count = 0;
while( n != 0 )
{
if( n & 1)
count++;
n = n >> 1;
}
return count;
}
};
但是如果这种情况我们输入一个负数的时候因为负数的二进制最高位都是1,所以如果不断的左移的话,我们的负数最高位最后始终都要置位1,可造成这个数变成0xffffffff而陷入死循环。
因此我们可以不对这个数进行操作,而是同一个一个flag位,从最低位不断的移动,移动到高位去和这个数的每一位进行与操作进行判断。
因此有方法三:
方法三:不改变这个数,通过一个flag左移进行判断
ps:1<< 32 结果是0
所以此循环会运行32次。
class Solution {
public:
int hammingWeight(uint32_t n) {
if( n == 0 )
return 0;
int count = 0;
uint32_t flag =1 ;
while( flag )
{
if( n & flag)
count++;
flag = flag << 1;
}
return count;
}
};
方法四:每次消去最右边的1,直到消完为止
class Solution {
public:
int hammingWeight(uint32_t n) {
if( n == 0 )
return 0;
int count = 0;
while( n )
{
count++;
n = (n -1) & n;
}
return count;
}
};
负数的二进制表示
在计算机中,
正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数以其正值的补码形式表示,如单字节-5,在计算机中表示为1111 1011。
所以正数与负数的转换只需要在原来正数的原码基础上取反得到反码再+1得到补码就是我们的负数的二进制
int tonNegative(int num)
{
return (~num) + 1;
}