【剑指offer - C++/Java】11、二进制中1的个数

在线题目链接:二进制中1的个数

文章目录

  • 1 题目描述
  • 2 题目分析
    • 2.1 方法1
      • 2.11 Java代码
      • 2.12 C++代码
    • 2.2 方法2
      • 2.21 Java代码
      • 2.22 C++代码
  • 3 总结

1 题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

2 题目分析

2.1 方法1

这道题看起来很简单。假设输入的整数是n。
只需要将n与1进行相与运算,看结果是不是0,然后再将n右移,再循环上述步骤直到n=0为止。看起来是这样,但是这样做存在一定的问题。
题目中明确说出n可能为负数,如果将负数右移,那么高位会被符号1填充,这就导致结果不正确。不过在java中,可以使用“>>>”进行无符号右移。
在C++中不能进行无符号右移,所以我们就干脆不右移,而是左移。左移的话不会产生因为符号而不同的结果。具体的做法可以让n与1相与,然后让1左移,然后重复让n与左移后的1相与…

2.11 Java代码

常规的左移相与操作

public class Solution {public int NumberOf1(int n) {int cnt = 0;int flag = 1;while(flag!=0){if((n&flag)!=0)cnt++;flag=flag<<1;}return cnt;}
}

下面是使用java的无符号右移“>>>”

public class Solution {public int NumberOf1(int n) {int cnt = 0;while(n!=0){if((n&1)!=0)cnt++;n=n>>>1;  //java没有unsigned关键字,>>>就是java中的无符号右移}return cnt;}
}

2.12 C++代码

class Solution {
public:int  NumberOf1(int n) {int cnt = 0;unsigned int flag = 1;while(flag){if(n & flag)cnt++; //不管n是不是负数,都成立flag=flag<<1;}return cnt;}
};

2.2 方法2

方法1比较常规。还有更加高效的方法。

根据下面的原理:

  • 把一个整数减去1,再和原来的整数做相与运算,会把该整数二进制的最右边的1变成0。

那么根据上述的原理,一个整数中有多少个1,就可以进行多少次上述的相与运算。根据这种思路,可以写出更加高效的算法。

2.21 Java代码

public class Solution {public int NumberOf1(int n) {int cnt = 0;while(n!=0){cnt++;n=n&(n-1);}return cnt;}
}

2.22 C++代码

class Solution {
public:int  NumberOf1(int n) {//把一个整数减去1,再与原整数相与,会把原整数的最右边的1变成0int cnt = 0;while(n){cnt++;n=n&(n-1);}return cnt;}
};

3 总结

注意位运算的思路。位运算一般具有发散思维,比较难想。

探讨学习加:
个人qq:1126137994
个人微信:liu1126137994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS 启动不了(服务没有及时响应启动或控制请求)解决

以前用360时为了加快开机速度,经常禁用一些服务, 就是这样 Eventlog WorldWideWebPublishing Remote Procedure Call IIS Admin Service 把这些服务都启动了就能启动iis网站了转载于:https://www.cnblogs.com/x4646/articles/1948780.html

【剑指offer - C++/Java】12、数值的整数次方

在线题目链接&#xff1a;数值的整数次方 文章目录1 题目描述2 题目分析2.1 方法1 循环2.11 Java代码2.12 C代码2.2 方法2 递归2.21 Java代码2.22 C代码3 总结1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方…

ASP.NET四种页面导航方式之比较与选择

在ASP.NET应用中&#xff0c;Web表单之间的导航有多种方式&#xff1a;用超级链接&#xff0c;用Response.Redirect&#xff0c;用Server.Transfer&#xff0c;或者用Server.Execute。本文将分析这四种导航方式的异同及其优缺点&#xff0c;帮助你选择最佳的导航方式。 一、超级…

【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面

在线题目链接&#xff1a;调整数组顺序使奇数位于偶数前面 文章目录1 题目描述2 题目分析2.1 方法12.11 Java代码2.12 C代码2.2 方法22.21 Java代码2.22 C代码3 总结1 题目描述 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位…

Camparable与Comparator之区别

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的&#xff0c;这个类对象组成的集合就可以直接使用sort方法排序。 Comparator可以看成一种算法的实现&#xff0c;将算法和数据分离&#xff0c;Comparator也可以在下面两种环境下使用&#xff1a; 1、类的设计…

【剑指offer - C++/Java】14、链表中倒数第k的节点

在线题目链接&#xff1a;链表中倒数第k的节点 文章目录1 题目描述2 题目分析2.1 Java代码2.2 C代码3 总结1 题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 2 题目分析 这道题比较简单。常规做法是先求出链表的总的节点个数n&#xff0c;然后再从头开始找第n-…

beta:scrum5

今天的工作 周一的工作 困难 王佳磊 收集数据&#xff0c;build了online的数据库, 38934 38939&#xff0c;收集更多数据&#xff0c;在新的API环境下&#xff0c;逐步发现并fix掉以前姓名到ID映射的bug. API的改动&#xff0c;ID的合并 肖巍&#xff0c;兰翠玲 等待测…

【软件开发底层知识修炼】十三 链接器-如何写出不依赖C库函数的代码

本文将综合以下4篇文章&#xff0c;学习如何写出不依赖libc库的程序&#xff1a; 【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数【软件开发底层知识修炼】十一 链接器-链接脚本【软件开发底层…

前端学习(218):属性选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>属性选择器&…

【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用

前面几篇文章学习了链接器相关的内容。现在开始来学习GDB调试。我们的目的是通过这几篇文章将GDB调试完全学会。 文章目录1 为什么需要GDB2 GDB 的常规应用3 GDB调试程序实例4 总结1 为什么需要GDB 什么是GDB&#xff1f; GNU项目中的调试器&#xff08;gnu debuger&#xff0…

前端学习(219):css伪类选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS伪类<…

【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

上一篇文章我们学习了使用GDB的最基本方法&#xff1a;【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试。断点调试是一种非常重要的调试方法。 文章目录1 断点类型2 GDB软件断点调试相关操作2.1 通过函数名设置断点2.2 通过文件名行号…

Informix IDS 11体系操持(918测验)认证指南,第 4 部门: 机能调优(1)

对 IBM Informix Dynamic Server (IDS) 和它的分比如子体系举行调优&#xff0c;以失掉最佳机能。在一个冗长的概述之后&#xff0c;本教程给出了一些关于怎样检查数据库做事器及其子体系的例子。本文是这个分 8 部门的 系列教程 的第 4 部门&#xff0c;这个教程可以帮手您筹办…

前端学习(220):伪元素选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS伪元素&l…

【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试&#xff1a;【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试本篇文章继续上一篇文章的学习&#xff0c;如何使用GDB的数据断点监测内存中的变量是否被改变 文章目录1 GDB的数据断点1.1 利…

AllTray-将办法最小化到琐细托盘

Toy Posted in AppsAllTray 是一个很有效的小办法&#xff0c;操纵它你可以将办法的窗口最小化到琐细托盘&#xff0c;从而腾出桌面空间以作它用。此办法主要为那些没有原生供给最小化到琐细托盘成效的办法而预备的。今朝&#xff0c;AllTray 可以在 GNOME、KDE、Xfce、Fluxbox…

【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看

上一篇文章学习了如何使用GDB数据断点进行内存监测&#xff1a;【软件开发底层知识修炼】十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变本篇文章继续上一篇文章的学习&#xff1a;如何使用GDB进行函数调用栈的查看 文章目录1 backtrace和frame2 使用GDB进行函数调…

前端学习(221):字体属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS字体属性…

nload实时查看linux服务器网络流量的工具

如果你仅仅是想查询当前服务器的带宽,nload绝对是个很好用的一个工具,功能虽然很单一,但是很强.虽然不能像iptraf那样,可针对IP, 协议等条件来查询,可以实时地监控网卡的流量,分输入流量Incoming 和输出流量Outgoing两部分,同时统计当前,平均,最小,最大,总流量的值,并且用动态图…

前端学习(222):文本属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>CSS文本属性…