剑指Offer 二进制中一的个数

复制代码
 1 链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8
 2 来源:牛客网
 3 
 4 public class Solution {
 5     //从n的2进制形式的最右边开始判断是不是1
 6     /*
 7     * 该解法如果输入时负数会陷入死循环,
 8     * 因为负数右移时,在最高位补得是1
 9     * 二本题最终目的是求1的个数,那么会有无数个
10     * 1了。
11     */
12     //-------------可能陷入死循环的解法---------------------
13     public static int NumberOf1_CanNotUse(int n) {
14         int count = 0;
15         while (n != 0) {
16             /*
17             * 用1和n进行位与运算,
18             * 结果要是为1则n的2进制形式
19             * 最右边那位肯定是1,否则为0
20             */
21             if ((n & 1) == 1) {
22                 count++;
23             }
24             //把n的2进制形式往右推一位
25             n = n >> 1;
26         }
27         return count;
28     }
29     //---------------正解--------------------------------
30     //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数
31     private static int NumberOf1_low(int n) {
32         int count = 0;
33         int flag = 1;
34         while (flag != 0) {
35             if ((n & flag) != 0) {
36                 count++;
37             }
38             flag = flag << 1;
39         }
40         return count;
41     }
42     //--------------------最优解----------------------------
43     public static int NumberOf1(int n) {
44         int count = 0;
45         while (n != 0) {
46             ++count;
47             n = (n - 1) & n;
48         }
49         return count;
50     }
51     public static void main(String[] args) {
52         //使用n=10,二进制形式为1010,则1的个数为2;
53         int n = -10;
54         System.out.println(n + "的二进制中1的个数:" + NumberOf1(n));
55     }
56 }
View Code
复制代码

 

posted @   Lorazepam  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!
点击右上角即可分享
微信分享提示