二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
<<,>>和>>>:
左移运算符:右边补0,其他数字左移,左移一位相当于乘以2,n位乘以2^n次,如果一直左移,最后得到0
右移运算符(带符号):左边补符号位(符号位是0就补0, 1就补1),其他数字右移。
>>>: 左边补0,其他数字右移
Solution 1:
& 表示按位与,1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
 
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
while (n != 0) {
if ((n & flag) != 0)
count ++;
n = n >>>1;
}
return count;
}
 
Solution 2:
//一个整数不是0,则至少会有一个1,减一的话,如果整数最右边是1,则变成0(1111 - 1=1110),如果最右边的1右边还有0,则1变为0,剩下的0变成1(1100 - 1=1011),达到的效果就是从最右边的1开始,右边的数都取反,此时把减一的数和原来的数做与运算,则原来整数最右边1开始的所有位都变成0,所以把一个整数减一再和自己与运算,会让最右边的1变成0,那么此整数有多少个1,就要进行多少次运算。跟第一种方法对比,减小时间复杂度
public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }
}
 
Solution 3:用O(1)的方法,即空间换时间,先求出从0~2^16所有数1的个数,存在数组中,对于一个int,32位拆分成两个16位的分别计算1的个数,高16位可以右移16位计算1的个数,原数字&(1<<16-1),可以让高16位置0,从而获取低16位
 
posted @   MarkLeeBYR  阅读(180)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示