信息学奥赛初赛天天练-15-阅读程序-深入解析二进制原码、反码、补码,位运算技巧,以及lowbit的神奇应用

更多资源请关注纽扣编程微信公众号
在这里插入图片描述

1 2021 CSP-J 阅读程序1

阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填×;除特 殊说明外,判断题 1.5 分,选择题 3 分)

源码

#include<stdio.h>
using namespace std;int n;
int a[1000];int f(int x)//计算二进制1中1的个数
{int ret = 0;/*2 对应二进制 10 ,包含1个110&1=0 ret累加1次退出循环3对应二进制101,包含2个1101 & 100=100100&011=0 ret累加2次退出循环*/for(;x;x&=x-1) ret++;return ret;
}
/*lowbit 是将 x 转化成二进制数之后,只保留最低位(从右往左数,第一位)的1及其后面的0,截断前面的内容,然后再转成10进制数lowbit(8)=8//8对应二进制为:1000 取最右边的1及后面3个0lowbit(12)=4//12对应二进制位:1100 取最右边的1及后面3个0lowbit(5)=1//5对应二进制为 101 取最右边1及其后面的0*/
int g(int x)
{return x & -x;
}int main()
{scanf("%d",&n);for (int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++)printf("%d ",f(a[i])+g(a[i]));printf("\n");return 0;
}

判断题

1 输入的n等于1001时,程序不会发生下标越界( F )

2 输入的a[i]必须全为正整数,否则程序将陷入死循环( F )

3 当输入为“5 2 11 9 16 10” 时,输出“3 4 3 17 5” ( F )

4 当输入为“1 511998 ”时,输出为"18" ( T )

5 将原码中g函数的定义(13 -16行) 移到main函数的后面,程序可以正常编译运行( F )

单选题

6 当输入为"2 -65536 2147483647"时,输出为 ( B )

A. “65532 33”

B. “65552 32”

C. “65535 34”

D. “65554 33”

2 相关知识点

for 循环语句

重复执行一段代码,直到满足指定条件为止,使用三个表达式控制循环的初始化、退出条件和自变量更新,这3个表达式可以同时出现也可以部分出现

for (初始化表达式; 退出条件; 自变量更新) {// 循环体代码
}

示例代码

#include<bits/stdc++.h>
using namespace std;
/*for循环语句练习 
*/
int main(){//初始化表达式; 退出条件; 自变量更新 同时出现 for(int i=0;i<5;i++){cout<<i<<" ";}cout<<endl;//初始化表达式 提前定义 int i=0; for(;i<5;i++){cout<<i<<" ";}cout<<endl;//初始化表达式 提前定义  退出条件在循环题 i=0; for(;;i++){if(i>=5) break; cout<<i<<" ";}cout<<endl;//初始化表达式 提前定义  退出条件在循环题 自变量在循环体 i=0; for(;;){if(i>=5) break; cout<<i<<" ";i++;}return 0;
}

原码、反码和补码

1) 机器数

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1

4  对应二进制 0000 0100
-4 对应二进制 1000 0100

2) 机器数真值

机器数第一位为符号位,所以机器数的形式值不等于真正的数值。所以,将带符号位的机器数对应的真正数值称为机器数的真值

0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

3) 原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值

+2 的原码 0000 0010
-2 的原码 1000 0010

4) 反码

正数的反码是其本身

负数的反码是对原码进行符号位不变,其余各个位取反

+2 的原码 0000 0010   反码 0000 0010
-2 的原码 1000 0010   反码 1111 1101

5) 补码

正数的补码就是其本身

负数的反码是对反码+1

+2 的原码 0000 0010   反码 0000 0010  补码  0000 0010
-2 的原码 1000 0010   反码 1111 1101  补码  1111 1110

位运算

1) 取反运算(~)

是转换2进制后,每1位取反,0变1,1变0

示例代码

//按位取反 ~
#include<bits/stdc++.h>
using namespace std;int main(){/*正数的原码,反码,补码都是相同4 对应二进制 0000 0100 按位取反1111 1011 计算机是以补码形式存在,需要转换成原码-1变成反码1111 1010按位取反变成原码1000 0101 第1位是符号位,所以结果是-5 */ int a=4;int b=~a;//转二进制补码后按位取反后再转成原码 cout<<b; //结果是-5 return 0;
}

2) 左移(<<)、右移(>>)

左移

左移1位,所有位都左移,末尾补0

右移

右移1位,所有位都右移,首尾补0

示例代码

//左移 <<  右移 >>
#include<bits/stdc++.h>
using namespace std;int main(){int a=3;/*3 对应二进制 0000 0011 左移1位,所有位都左移,末尾补00000 0110此时对应二进制转十进制为6 */int b=3<<1; cout<<"b的值为:"<<b<<endl;//所以b的值为6 int c=8;/*8 对应二进制 0000 1000 右移1位,所有位都右移,首尾补00000 0100此时对应二进制转十进制为4 */int d=c>>1;cout<<"d的值为:"<<d;//所以d的值为4return 0;
}

3) 按位与 (&)

运算规则,按位与的2个位同时为1时,结果为1,否则为0

示例代码

#include<bits/stdc++.h>
using namespace std;int main(){int a=5;int b=6;/*5对应的二进制为0000 0101 6对应的二进制为0000 0110所以 5 & 60000 0101& 0000 0110-------------0000 0100转对应10进制为4 */ int c=a&b;cout<<"c的值为:"<<c; //输出c的值为4 return 0;
}

4) 按位或 (|)

运算规则,按位或的2个位其中有1个为1,结果为1,否则为0

示例代码

#include<bits/stdc++.h>
using namespace std;int main(){int a=5;int b=6;/*5对应的二进制为0000 0101 6对应的二进制为0000 0110所以 5 & 60000 0101| 0000 0110-------------0000 0111转对应111进制为7 */ int c=a|b;cout<<"c的值为:"<<c; //输出c的值为7   return 0;
}

5) lowbit

lowbit(x)是将 x 转化成二进制数之后,只保留最低位(从右往左数,第一位)的1及其后面的0,截断前面的内容,然后再转成10进制数
例如

lowbit(8)=8//8对应二进制为:1000 取最右边的1及后面3个0
lowbit(12)=4//12对应二进制位:1100 取最右边的1及后面3个0
lowbit(5)=1//5对应二进制为 101 取最右边1及其后面的0

示例代码

#include<bits/stdc++.h>
using namespace std;int g(int x){return x & -x;
}int main(){int n=1;/*1的补码0000 0001-1的原码1000 0001-1的反码1111 1110-1的补码1111 11111 & -10000 0001&1111 1111-----------0000 0001  */ cout<<"g(1)的值是: "<<g(n)<<endl;//输出1n=3;/*3的补码0000 0011-1的原码1000 0011-1的反码1111 1100-1的补码1111 11011 & -10000 0001&1111 1101-----------0000 0001  */ cout<<"g(3)的值是: "<<g(n)<<endl;//输出1 n=8;/*3的补码0000 1000-1的原码1000 1000-1的反码1111 0111-1的补码1111 10001 & -10000 1000&1111 1000-----------0000 1000  */ cout<<"g(8)的值是: "<<g(n)<<endl;//输出8 return 0;
}

6) x&=x-1

x&=x-1 去除二进制补码最后1个1

示例代码

#include<bits/stdc++.h>
using namespace std;
/*去除二进制补码最后一个1正数 9对应补码 0000 1001 8对应补码 0000 1000 x&=x-1;0000 1001 
& 0000 1000 
-------------0000 1000
结果为10进制的8负数-9原码  1000 1001反码  1111 0110补码  1111 0111x-1 -9-1=-10原码  1000 1010反码  1111 0101补码  1111 0110x&=x-1;1111 0111
& 1111 0110 
-------------1111 0110 比-9的补码 1111 0111少了末尾的1补码 1111 0110  对应反码 1111 0101 对应原码 1000 1010 对应十进制-10 
*/ 
int main(){int x=9;//去除二进制补码最后1个1 x&=x-1;cout<<x<<endl;//输出 8 x=-9;//去除二进制补码最后1个1 x&=x-1;cout<<x<<endl;//输出 -10 return 0;
}

3 思路分析

判断题

1 输入的n等于1001时,程序不会发生下标越界( F )

分析

a[1000]的下标范围为a[0] - a[999],所以a[1000]会导致越界

2 输入的a[i]必须全为正整数,否则程序将陷入死循环( F )

分析

负数不会进入死循环,负数计算机补码表示

例如 -3

在8位二进制中

原码 1000 0011

反码 1111 1100

补码 1111 1101

对应32位补码是

11111111111111111111111111111101

是31个1

3 当输入为“5 2 11 9 16 10” 时,输出“3 4 3 17 5” ( F )

分析

根据函数作用逐一输入上面5个数计算

输入数据后逐个计算,输出为3 4 3 17 4

f(2)+g(2)=1+2=3

f(2)+g(2)=3+1=4

f(2)+g(2)=2+1=3

f(2)+g(2)=1+16=17

f(2)+g(2)=2+2=4

4 当输入为“1 511998 ”时,输出为"18" ( T )

分析

511998 对应二进制 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0

f(2)+g(2)=16+2=18

5 将原码中g函数的定义(14 -16行) 移到main函数的后面,程序可以正常编译运行( F )

分析

main函数调用的函数必须在main函数前面定义,否则编译会出错

单选题

6 当输入为"2 -65536 2147483647"时,输出为 ( B )

A. “65532 33”

B. “65552 32”

C. “65535 34”

D. “65554 33”

分析

-65536

原码

00000000000000010000000000000000

反码

11111111111111101111111111111111

补码

11111111111111110000000000000000

所以f(-65536)+g(-65536)=16+65536=65552

2147483647 是2^32-1,31个1,最高位是符号位

正数的原码,反码,补码都相同

01111111111111111111111111111111

f(2147483647)+g(2147483647)=31 + 1=32

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

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

相关文章

debian11安装留档@VirtualBox

因为debian12无法安装tpot&#xff0c;所以又把11重新安装一遍&#xff0c;以前的安装文档&#xff1a;安装Debian 11 留档-CSDN博客 下载光盘 华为云地址&#xff1a;https://repo.huaweicloud.com/debian-cd/11.0.0/amd64/iso-cd/ 使用了debian11 教育版&#xff0c;比较有…

【第7章】SpringBoot整合Mybatis-Plus

文章目录 前言一、引入库二、案例1.UserMapper2.UserController3. 结果 三、配置总结 前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 上一篇内容已经整合过Mybatis&#xff0c;这里在…

车载电子电器架构 —— 智能座舱标准化意义

车载电子电器架构 —— 智能座舱标准化意义 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…

11.RedHat认证-Linux文件系统(中)

11.RedHat认证-Linux文件系统(中) Linux的文件系统 格式化分区(1道题) #对于Linux分区来说&#xff0c;只有格式化之后才能使用&#xff0c;不格式化是无法使用的。 #Linux分区格式化之后就会变成文件系统&#xff0c;格式化的过程相当于对分区做了一个文件系统。 #Linux常见…

Linux搭建PHP下的RabbitMQ环境(php-amqp/rabbitmq-c/erlang)

本文演示环境 Red Hat 11.2.1-9gcc (GCC) 11.2.1 20220127OpenSSL v1.1.0PHP 7.1 安装erlang erlang和RabbitMQ有版本对应关系Erlang Version Requirements&#xff0c;需要选择正确的版本。 本文以erlang 26和RabbitMQ 3.13.2为例。 erlang下载地址 下载包上传服务器后&a…

【介绍下运维开发】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

每日复盘-20240529

20240529 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------300637--------- 扬帆新材 二日涨幅最大: ------1--------30…

el-pagination在删除非第一页的最后一条数据遇到的问题

文章目录 前言一、问题展示二、解决方案三、源码解析1、elementui2、elementplus 总结 前言 这个问题是element-ui中的问题&#xff0c;可以从源码中看出来&#xff0c;虽然页码更新了&#xff0c;active也是对的&#xff0c;但是未调用current-change的方法&#xff0c;这里就…

爬虫案例(读书网)

一.我们还是使用简单的bs4库和lxml&#xff0c;使用xpath&#xff1a; 导入下面的库&#xff1a; import requests from bs4 import BeautifulSoup from lxml import etree 我们可以看见它的div和每个书的div框架&#xff0c;这样会观察会快速提高我们的简单爬取能力。 二.实…

Element-UI 入门指南:从安装到自定义主题的详细教程

Element-UI 是一个基于 Vue.js 的前端组件库&#xff0c;它提供了丰富的 UI 组件&#xff0c;可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南&#xff1a; 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的…

原神抽卡点名程序教程(直接下载用)

今天我要给大家分享一个在抖音上特别火的视频——原神抽卡点名程序教程。 &#xff08;要源码的私信扣31&#xff09; 废话不多说&#xff0c;直接上效果图 &#xff1a; 步骤1&#xff1a; 步骤2&#xff1a;&#xff08;写名单&#xff0c;前面加数字代表星级&#xff0c;用…

JAVA类与方法·易错题分析

分析一下作业中关于类与方法写错或者易错的题。 N o . 1 No.1 No.1 下面程序的执行结果是______。 public class Test7 {public static void main(String[] args){new B().display();} } class A{public void draw() {System.out.print("Draw A.");}public void di…

用户接入和认证技术

一、用户接入和认证配置 称为网络接入控制&#xff0c;通过对接入网络的客NAC (Network Admission Control)户端和用户的认证保证网络的安全&#xff0c;是一种“端到端”的安全技术。包括802.1x认证、MAC认证与Portal认证。 二、三种认证方式简介 1、Portal认证 Portal认证通…

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发

一、概念 MapReduce是一个 分布式运算程序 的编程框架&#xff0c;是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 &#xff0c;并发运行在一个 Hadoop集群上。 1、M…

2.1色彩空间

色彩发送器 色彩认知 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认知感知。 光的要素 光…

【数据结构】探索树中的奇妙世界

专栏介绍&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累…

C#多线程同步lock、Mutex

C#使用多线程可以通过System.Threading命名空间下的Thread类来实现 lock和Mutex用于实现线程同步的机制&#xff1a; 上代码&#xff1a; class People{public People(int idd){id idd;}public int id;public int age;}class TestHelper{public TestHelper() { }List<Peo…

四川汇聚荣聚荣科技有限公司是正规的吗?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;越来越多的科技公司如雨后春笋般涌现。然而&#xff0c;在这个信息爆炸的时代&#xff0c;如何判断一家公司是否正规成为了许多人关注的焦点。本文将围绕“四川汇聚荣聚荣科技有限公司是否正规”这一问题展开讨论&#xf…

CSS学习笔记:vw、vh实现移动端适配

移动端适配 移动端即手机端&#xff0c;也称M端 移动端适配&#xff1a;同一套移动端页面在不同屏幕尺寸的手机上可以实现宽度和高度的自适应&#xff0c;也就是页面中元素的宽度和高度可以根据屏幕尺寸的变化等比缩放 之前我在一篇博客中介绍了rem实现移动端适配&#xff0…

Django之文件上传(一)

一、环境搭建 建立项目 django-admin startproject project_demo配置数据库(以MySQL为例) # settings.py DATABASES = {default: {ENGINE: django.db.backends.mysql,NAME: django_file4,USER: root,PASSWORD: 123,HOST: 192.168.31.151,PORT: 3306,} }建立模型 class UploadF…