zoukankan      html  css  js  c++  java
  • 26 二进制中1的个数

    基础知识

    正整数n的补码x有:n+x=10000000000000000
                                     x=10000....00-n
    负整数-n在二进制里表示就是:-n绝对值的补码。即x

    这里有个难点是如何处理负数。
    在C++中如果我们右移一个负整数,系统会自动在最高位补1,这样会导致 nn 永远不为0,就死循环了。
    解决办法是把 nn 强制转化成无符号整型,这样 nn 的二进制表示不会发生改变,但在右移时系统会自动在最高位补0

     int NumberOf1(int n) {
            int res = 0;
            unsigned int un = n; 
            while (un) 
            {
                res += un & 1;
                un >>= 1;
            }
            return res;
        }

    遇到问题

    1.

    res += un & 1;
    这句刚开始写成
    res = res  +  un & 1;
    不能得到正确答案。
    后发现:+的优先级高于&。
    会先执行+操作,再执行&
    

     2

     un >>= 1;
    刚开始写成
     un >> 1;
    

    3

     while (un) res += un & 1, un >>= 1;
    效果等同于
      while (un) 
            {
                res += un & 1;
                un >>= 1;
            }
    


           

    带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
  • 相关阅读:
    单位换算 M、Mb、MB
    数据库事务原子性、一致性、隔离性、持久性
    进制转换
    SpringBoot application.yum配置
    private 与 super
    sql 字段别名里包含特殊字符
    sql 中的分隔符
    sql 中的注释
    windows Ctrl + Alt + 方向键 取消屏幕反转
    1finally与return、exit()
  • 原文地址:https://www.cnblogs.com/make-big-money/p/12303233.html
Copyright © 2011-2022 走看看