题解 | #二进制中1的个数#

二进制中1的个数

http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8

基础知识

  • 负数在计算机中是用补码来存储的,由于正数的补码就是原码,姑可以推广到所有的数在计算机中都是用补码来存储的。
  • 原码:就是数的二进制形式。负数的原码最高位是1,代表符号位。
  • 反码:正数的反码还是其本身,负数的反码是在原码的基础上,符号位不变,其余位按位取反。
  • 补码:正数的补码还是其本身,负数的补码在其反码的基础上加一。

代码实现

class Solution {
public:
     int  NumberOf1(int n) {
     	int ans=0;
     	while(n!=0)
     	{
            ans++;
            //消掉一个1
            n = n&(n-1);
     	}
     	return ans;
     }
};

小技巧
通过位运算公式 n & (n - 1)可以消去二进制n的最右边的一个一(小伙伴们可以自己手动计算一下,负数正数都试试)。其上述代码的思想就是不断消1,消一次使得计数器加一。最后使n变成零结束循环。

我提一嘴

可能有人会疑惑(我觉得应该有的吧-△-), 整数转换为二进制的代码在哪儿呢? 其实n&(n-1)的运算过程中计算机会自动将n转换为二进制计算的,(说转化不太严谨,n本来就是以二进制的形式存储在计算机中的)。

全部评论
太巧妙了这个方法
点赞 回复 分享
发布于 2022-03-23 20:14
小技巧里写错了,应该是消去最右边的一个1
点赞 回复 分享
发布于 2022-03-12 10:38

相关推荐

11-28 16:00
已编辑
武汉理工大学 Java
想干测开的tomca...:这份简历是“短期项目硬堆中大型系统技术”的“技术炫技式造假模板”,槽点密集到能当反面教材: ### 1. 「项目时长」和「技术密度」严重脱节,造假痕迹焊死在简历上 两个项目时长分别是**3个月、2个月**,但堆了Spring AI、Elasticsearch、MinIO、Kafka、ShardingSphere、Docker、Sentinel等近20个中大型项目才用的技术——正常情况下,光把这些中间件的文档看完+环境搭好,3个月都不够,更别说实现“AI多轮对话、分库分表、RBAC权限、大模型调用”这些功能。 说白了:你这不是“做项目”,是把“后端技术栈清单”往项目里硬塞,明摆着“只调用了API,没碰过核心逻辑”。
点赞 评论 收藏
分享
评论
15
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务