191. Number of 1 Bits(?)

一、题意
Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11’ has binary representation 00000000000000000000000000001011, so the function should return 3.
二、分析和解答
其实就是把整数转换为二进制,然后查看它的一的位数。
1、十进制转换为二进制,通用版本是,取余 + 除2!!!

 public int hammingWeight(int n) {
        int count = 0;
        while(n != 0){
            int value = n % 2;
            n = n / 2;
            if(value == 0)
                count++;
        }
        return count;
    }

(Wrong Answer)2147483648 (10000000000000000000000000000000)输出值为0!越界的问题吗?这样不对!为什么不知道!
不过这样不是一个好方法,以后转换为二进制的方法或者这道题第一反应应该是位运算:左移、右移、异或、and、or。目前我对异或和&的运行机制还不太清楚,比如说这道题!!!
我判断异或的结果为1的竟然是错误的!
2、(TLE超时)
当我使用 >> 的时候,报错这个,我估计上面那个也是这种情况吧!
Last executed input:
2147483648 (10000000000000000000000000000000)
3、下面是正确的结果:

 public int hammingWeight(int n) {
        int count = 0;
        while(n != 0){
            int value = n & 1;
            if(value == 1)
                count++;
            n = n >>> 1;
        }
        return count;
    }

注意:除以2是右移一位。我开始写的时候写错了。>>>指的是无符号右移!
&:
1 & 1 = 1;
0 & 1 = 0;
1 & 0 = 0;
0 & 0 = 0;
4、更简单的一种方法:

    public int hammingWeight(int n) {
        int count = 0;
        while(n != 0){
           n = n & (n-1);
            count++;
        }
        return count;
    }

问题:
1、前两种方法错误的底层原因
2、& 和 ^ 的运算机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值