我是靠谱客的博主 儒雅水壶,最近开发中收集的这篇文章主要介绍剑指offer学习笔记——位运算1:统计二进制中的1的个数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二进制相对于十进制来说总是比较抽象的。

例题:对于给定一个整数,要求统计整数中的二进制个数。

这个题有一个常规的思路就是我们统计这个整数最后一位是不是1,然后再将其右移移位。但是由此出现了一个严重的问题,如果是负数的话,右移之后前面时补1的,而不是补0。所以除非实现规定好右移多少次(4个字节 32次),否则,如果整数是否变为0来作为循环判断的话是会陷入死循环。

以此为启发,我们不移动整数了。以此判断从末尾到首位一共有多少个1:

int  NumberOf1(int n) {
         int count = 0;
         unsigned int flag = 1;
         while(flag)     //循环结束条件一个关键的点,无符号的int在移位32次(32位,4个字节)后,会变成0
         {
             if(n&flag)
                 count++;
             flag<<=1;
         }
         return count;
     }

另外一个方法是减去1,整数中有多少位1就循环多少次,十分简洁:

    int  NumberOf1(int n) {
         int count = 0;
         while(n)     //循环结束条件一个关键的点,无符号的int在移位32次(32位,4个字节)后,会变成0
         {
             n = (n-1)&n;//这个运算每做一次就会使得二进制中的1少一个
             count++;
         }
         return count;
     }

最后

以上就是儒雅水壶为你收集整理的剑指offer学习笔记——位运算1:统计二进制中的1的个数的全部内容,希望文章能够帮你解决剑指offer学习笔记——位运算1:统计二进制中的1的个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部