查看: 863| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

191. Number of 1 Bits有疑问

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int one=0;
        while(n!=0){
            one=one+(n&1);
            n=n>>>1;
        }
        return one;
    }
}

n&1  1  可以理解 为什么换成 n|0 或者 n^0 就不行了?



补充内容 (2018-7-7 00:06):
0&1 0      0|0  0    0^0  0
1&1 1      1|0  1    1^0  1

上一篇:分享一下非cs专业自学+刷题经验
下一篇:大家面试都用什么语言?有遇到过对语言有要求的公司吗?
全局:
这样说吧, 你的代码如果不是自己写的大概是不太容易理解这个答案 [似乎是个废话].. 所以你知道 >>> 的意思么? 希望不是死记硬背的答案.

n & 1 代表的是 n的最后一位和 1 and 之后的结果. 这是因为1的二进制表示是 31个0 和 1 个1.

所以如果n的最后一位是1的话, 结果为1; 结尾是0的话, 结果为0. 这也就是为什么可以 one += (n & 1);

而 n | 0 或者 n ^ 0 呢, 0 其实是 32个0 的意思. 那么你 n | 0 或者 n ^ 0 之后就是 n本身, 至于这个结果是多少.. 那就看n本身了, 当然了这个是没办法数 1 的个数的.

我提供另外两个思路.. 也许也不一定特别好理解

把数字直接变成binary string, 然后数1..
```
    public int hammingWeight(int n) {
        int re = 0;
        String ns = Integer.toBinaryString(n);
        for(char ch : ns.toCharArray())
            if(ch == '1') re++;
        return re;
    }
```
或者这个方法和你写的基本差不多, 我个人更喜欢左移.

```
    public int hammingWeight(int n) {
        int re = 0;
        for(int i = 0; i < 32; i++)
        {
            if((n & (1 << i)) != 0)
                re++;
        }
        return re;
    }
```
回复

使用道具 举报

🔗
magicsets 2018-7-8 03:12:14 | 只看该作者
全局:
举个例子,当n=3时,如下代码输出什么?


  1. public class Main {
  2.   public static void main(String[] args) {
  3.     int n = 3;
  4.     System.out.println(n & 1);
  5.     System.out.println(n | 0);
  6.     System.out.println(n ^ 1);
  7.   }
  8. }
复制代码


你可以跑一下代码,看看是不是和你的预期一致。
回复

使用道具 举报

全局:
肥宅快乐水 发表于 2018-7-7 12:43
这样说吧, 你的代码如果不是自己写的大概是不太容易理解这个答案 [似乎是个废话].. 所以你知道 >>> 的意思 ...

竟然忘了这个标准解法。。

```
    public int hammingWeight(int n) {
        int re = 0;
        while(n != 0)
        {
            n -= (n & -n);
            re++;
        }
        return re;
    }
```
做BIT树的时候会用到的这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表