阳康后的第一篇博客,先来几道恶心二进制编程题

news2024/11/27 21:04:34

目录

一、统计二进制中1的个数

二、打印整数二进制的奇数位和偶数位

三、两个整数二进制位不同个数


一、统计二进制中1的个数

这是一道牛客网OJ题,感兴趣的话可以先做一遍再看解析哦 -> 牛客网的OJ链接

注意:上面的牛客网是接口型,不需要写主函数,系统默认主函数是存在的,只需要完成函数即可。

题目描述:输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

思路:假设想打印一个整数的十进制的每一位,例如123,我们会先让123%10,得到3,再让123/10,得到12。然后再把12%10,以此类推就能得到它们的每一位,所以总结一下,一个整数的十进制只需循环除10和模10。然而得到二进制的每一位也是如此,只要将二进制循环模2和除2即可。例如:11的二进制为0000 1011,首先让11%2=1,这个1就是二进制序列上最后一个1,再让11/2=5,5的二进制就是101(就是上面加粗部分)。既然有思路,那我们就来看看怎么写代码吧。

按照上面的思路,不难可以写出这样的代码,但是提交发现代码错误。

举个栗子:当n = -1时,不为0进入循环,-1%2不等于1,cnt不会++,走到n /= 2,带入n的值发现n的结果为0,0为假cnt自然而然就输出0了。说明以上代码对负数是不太友好的。下面有2个办法可以解决改问题。

解决办法1:首先可以把-1当做无符号数来看待,所以只需要在int n前加上 unsigned

解决方法2:可以运用&这个操作符( 点我,快速了解操作符)

假设有一个二进制序列为(有32位,简写):00001111,我们&上一个1就能得到最低位的1(加粗),那么问题来了,如何得到其他位上的1呢?这时位移操作符就派上用场了,只需要把00001111右移1位,然后再&上一个1即可。

最后,对于这题,我再为大家展现一个绝妙的解题方法!!

有个表达式是: n = n & (n- 1)

这是一个非常神奇的表达式,当n = 11,它的二进制为1011,n - 1 = 10,它的二进制是1010,1011 & 1010 = 1010(十进制:10),有没有发现,最低位的1不见了;接着,n - 1 = 9,它的二进制为1001,然后再让1010 & 1001 = 1000,这时,最低位的1又不见了。所以,每执行这个表达式,n的二进制最低位上的1都会消失,这个表达式执行几次,就会有多少个1。


对于上面的表达式,还能这么用

假设用编程实现n是否为2的k次方。

思路:只要是2的k次方数字,它们的2进制的表示中只有一个1

例如:2的3次方 ---- 1000
2的2次方 ---- 100
2 的 4次方 ---- 10000
这时就能灵活运用刚刚讲过的表达式:if(n & (n - 1) == 0)

二、打印整数二进制的奇数位和偶数位

题目内容:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。

思路:

假设要打印上图中的二进制序列的奇数位和偶数位,那么如何得到它们对应的二进制数字呢?通过上一题也不难发现,只要将(n >> i) & 1即可

代码实现:

#include <stdio.h>
void Print(int n)
{
    printf("奇数位:");
    int i = 0;
    for (i = 31; i >= 1; i -= 2)
    {
        printf("%d ", (n >> i) & 1);
    }
    printf("\n");

    printf("偶数位:");
    for (int i = 32; i >= 2; i -= 2)
    {
        printf("%d ", (n >> i) & 1);
    }
    printf("\n");
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    Print(n);  //封装一个Print函数
    return 0;
}

三、两个整数二进制位不同个数

描述:输入两个整数,求两个整数二进制格式有多少个位不同(点我,做题!)

思路:先将n和m进行按位异或(^),此时n和m相同的二进制位清零,不同的二进制位为1,最后统计异或后结果的二进制位有几个1即可 。( 点我查看操作符详解)
#include <stdio.h>
int one(int m,int n)
{
    int cnt = 0;
    int tmp = m ^ n;
    while(tmp)
    {
        tmp = tmp & (tmp - 1);
        cnt++;
    }
    return cnt;
}
int main()
{
    int m = 0;
    int n = 0;
    scanf("%d %d",&m,&n);
    
    int res = one(m,n);
    printf("%d\n",res);
    return 0;
}

四、总结

阳康后第一篇博客,欢迎大佬们指点,后面开始继续输出。加油!!!

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

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

相关文章

Vagrant管理已存在的虚拟机

起因 某天打开VirtualBox后&#xff0c;发现之前创建的虚拟机都没了&#xff0c;后将虚拟机从本地磁盘又重新导入&#xff0c;但是发现使用 vagrant up 会创建新的虚拟机&#xff0c;而我要用vagrant管理已存在的虚拟机&#xff0c;就是 vagrant up的时候&#xff0c;我需要启动…

MySQL数据库:常用数据类型

一、整形和浮点型 数据类型大小说明对应C类型bit(n)n指定比特位数&#xff0c;默认1位比特位数&#xff0c;n范围1-64&#xff1b;存储数值范围2-2^n-1char[]tinyint1字节signed charsmallint2字节short intint4字节intbigint8字节long long intfloat(m,d)4字节单精度&#xf…

【前端】CSS基础

一、CSS基础 1.1CSS的介绍 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets&#xff09; CSS作用是什么&#xff1f;&#xff1f; 1.2CSS语法规则 写在哪里&#xff1f; CSS是style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下…

真的强,又一个开源项目,杀疯了

最近&#xff0c;AI大模型连续火爆出圈&#xff0c;人工智能生成模型&#xff08;AIGC&#xff09;的热度尚未褪去&#xff0c;聊天机器人ChatGPT便引发全网热议&#xff0c;两周吸引百万用户。还有卷趴一半程序员的AlphaCode&#xff0c;生成全新蛋白质的ESM2等&#xff0c;不…

TypeScript,终于在实际项目中用到了泛型。

终于在实际项目中用到了泛型 里程碑式的纪录&#xff0c;终于不是anyScript了&#xff0c;代码写完只有一个any 应用 项目中组件化了这么一个东西 功能描述&#xff1a; 传进去一个数组&#xff0c;有个名&#xff0c;有个key&#xff0c;渲染成上图的div样式点击之后&#…

Triple 协议支持 Java 异常回传的设计与实现

作者&#xff1a;陈景明 背景 在一些业务场景&#xff0c;往往需要自定义异常来满足特定的业务&#xff0c;主流用法是在catch里抛出异常&#xff0c;例如&#xff1a; public void deal() {try{//doSomething ...} catch(IGreeterException e) {...throw e;} }或者通过…

Python面向对象(九)

python学习之旅(九) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是面向对象 万物皆对象 现实世界的事物都有属性和行为,可在程序中抽离为类来描述现实世界的事物属性和行为。 使用类充当程序内现实事物的“设计图纸”&#xff0c;基于图纸(类)生产实体…

10. 正则表达式匹配

题目链接&#xff1a;https://leetcode.cn/problems/regular-expression-matching/从暴力递归到动态规划&#xff0c;对于状态转移方程不容易推导出来的可以先从递归进行尝试各种策略&#xff0c;最后再从暴力递归转为动态规划&#xff0c;这种尝试方式容易求解dp初始值以及dp更…

数据结构-考研难点代码突破 (图关键路径完全解析(流程+代码) - C++代码)

考研在关键路径上的考察以流程为主 文章目录1. AOE网2. 关键路径问题解决流程C代码1. AOE网 首先区分AOV网&#xff1a; AOV网∶若用DAG 图&#xff08;有向无环图&#xff09;表示一个工程&#xff0c;其顶点表示活动&#xff0c;用有向边<Vi&#xff0c;Vj>表示活动 V…

【ESP32+freeRTOS学习笔记-(五)队列Queue】

目录1、什么是队列Queue2、队列的多任务特性2.1 多任务的访问&#xff1a;2.2 队列读取阻塞&#xff1a;2.3 写队列阻塞&#xff1a;2.4 阻塞于多个队列&#xff1a;3、队列的使用3.1 创建队列--The xQueueCreate() API3.2 写入队列3.3 从队列中接收数据3.4 删除队列4、队列集4…

ReactDOM.render在react源码中执行之后发生了什么?

ReactDOM.render 通常是如下图使用&#xff0c;在提供的 container 里渲染一个 React 元素&#xff0c;并返回对该组件的引用&#xff08;或者针对无状态组件返回 null&#xff09;。本文主要是将ReactDOM.render的执行流程在后续文章中会对创建更新的细节进行分析&#xff0c…

MATLAB-plot3/ezplot3三维绘图

&#xff08;1&#xff09; plot3是三维绘图的基本函数&#xff0c;调用格式如下。1、plot3( X,Y,Z):绘制简单的三维曲线&#xff0c;当X、Y、Z是长度相同的向量时&#xff0c;plot3命令将绘制以向量X、Y、Z为(x, y,z)坐标值的三维曲线;当X、Y、Z是mn矩阵时,plot3命令将绘制m条…

Android 虚拟分区详解(四) 编译开关

Android Virtual A/B 系统简称 VAB,我将其称为虚拟分区。 本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r46 请已经购买《Android 虚拟分区》专栏的朋友加我 wx 进 "虚拟分区专栏 VIP 答疑"群,作为本专栏文章的附加服…

(6)元对象系统与信号与槽机制

1. 元对象系统 元对象系统是一个基于标准C的扩展&#xff0c;为Qt提供了信号与槽机制、实时类型信息、动态属性系统。 什么是元对象 在计算机科学中&#xff0c;元对象是这样一个东西&#xff1a;它可以操纵、创建、描述、或执行其他对象。元对象描述的对象称为基对象。元对象可…

记一次搭建备库,使用连接串主库无法连接到备库

主库使用连接串连接备库失败 SQL> conn sys/oracleorcldg as sysdba ERROR: ORA-12528: TNS:listener: all appropriate instances are blocking new connections 备库已经建立了静态监听 # listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/…

安全寒假第一堂课

一、状态码 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继续执行操作的状态码。 100&#xff08;继续&#xff09; 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一…

OpenCV实战(5)——图像运算详解

OpenCV实战&#xff08;5&#xff09;——图像运算详解0. 前言1. 图像基本运算2. 重载图像运算符2.1 加法运算符重载2.2 分割图像通道2.3 完整代码3. 图像重映射3.1 OpenCV 重映射函数3.2 完整代码小结系列链接0. 前言 图像可以以不同的方式进行组合&#xff0c;因为它们是正则…

XGBoost论文阅读

XGBoost: A Scalable Tree Boosting System 目录 XGBoost: A Scalable Tree Boosting System 1.摘要 2.方法 2.1 正则化学习目标 2.2 梯度提升树 2.3 收缩率和列采样 2.4分裂点查找算法 1.摘要 提出了一种新的稀疏性感知算法&#xff0c;用于稀疏数据和加权全图草图&a…

Python教程:什么是三级模式和二级映像?

美国国家标准学会(American National Standards Institute,ANSI)所属的标准计划与需求委员会&#xff08;Standards Planning and Requirements Committee,SPARC)在1971年公布的研究报告中提出了ANSI-SPARC体系结构&#xff0c;即三级模式结构&#xff08;或称为三层体系结构&a…

ArcGIS基础实验操作100例--实验53导出线、面要素的坐标值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验53 导出线、面要素的坐标值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xf…