Count one

Count how many 1 in binary representation of a 32-bit integer.

Example
Given 32, return 1
Given 5, return 2
Given 1023, return 9

问题不难,通过位运算(位移+位与)即可得到结果,需要注意的是细节:

  1. 符号数的表示,负数的表示。负数的情况下,由于符号位的存在,如果对 signed int 进行位右移运算,符号位会一直存在,数字最后无法变成0,会导致死循环。

  2. 二进制的转换成16进制的符号表示,是4个二进制位换算成一个16进制位,1000 0000 --> 0X80,需要注意。

  3. Java 和 C 的数据类型不同,C 可以转换成 unsigned int,Java 没有 unsigned int。不过,突然想到 Java 中存在 unsigned shift >>>,不妨一试。

C 语言版:

int countOne(int num) {
   unsigned u = (unsigned) num;
   int counter = 0;
   while (u) {
       if(u & 0x1) {
           counter++;
       }
       u = u >> 1;
   }
   return counter;   
}

Java 版一(去除符号位版)

public int countOnes(int num) {
     
        boolean isNegative = false;
        if (num<0) {
            isNegative = true;
            num = num ^ 0x80000000;
        }
       
        int bitCount = 0;
        while(num != 0) {
            if((num & 0x1) == 1) {
                bitCount++;
            }
            num = num>>1;
        }
        
        if(isNegative) bitCount++;
        
        return bitCount;
    }

Java unsigned shift version:

 public int countOnes(int num) {
        int bitCount = 0;
        while(num != 0) {
            if((num & 0x1) == 1) {
                bitCount++;
            }
            num = num>>>1; // unsigned shift 
        }
        return bitCount;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,775评论 0 33
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,176评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 参考链接 SqlPlus Set常用设置 常用命令 导出结果到文本:spool 例如:spool d:\Spool...
    iszengmh阅读 1,091评论 0 0
  • 戴了绿帽子之后,林光鲜毅然斩断情丝,把自己长时间封闭在黑暗的角落,用对初恋最狠毒的诅咒浇灌自己的恋爱观与伦理观,以...
    半点心helen阅读 239评论 0 0