信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned 关键字、二进制、位运算、左移、右移、异或运算

news/2024/11/15 3:20:10/文章来源:https://www.cnblogs.com/myeln/p/18412676
信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned 关键字、二进制、位运算、左移、右移、异或运算
PDF文档公众号回复关键字:20240913

2023 CSP-S 阅读程序1

判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

01 #include <iostream>
02 using namespace std;
03 
04 unsigned short f(unsigned short x) {
05     x ^= x << 6;
06     x ^= x >> 8;
07     return x;
08 }
09 int main() {
10     unsigned short x;
11     cin >> x;
12     unsigned short y = f(x);
13     cout << y << endl;
14     return 0;
15 }

假设输入的 x 是不超过 65535的自然数,完成下面的判断题和单选题

判断题

1 当输入非零时,输出一定不为零 ( )

2 (2 分)将 f 函数的输入参数的类型改为 unsigned int,程序的输出不变 ( )

3 当输入为 65535 时,输出为 63 ( )

4 当输入为 1 时,输出为 64 ( )

单选题

5 当输入为 512 时,输出为 ( )

6 当输入为 64 时,执行完第 5 行后 x 的值为 ( )

2 相关知识点

1) 常用数据类型

数据类型 描述 取值范围
char 字符型 -128 到 127 或 0 到 255(取决于是否是有符号的)
short 短整型 -32,768 到 32,767
int 整型 -2,147,483,648 到 2,147,483,647
long 长整型 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
long long 更长的整型 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

2) unsigned 关键字

用于声明无符号整数类型。无符号整数类型只能表示非负整数,即它们的值总是大于或等于零

例如

short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间
unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间

#include<bits/stdc++.h>
using namespace std;
/*无符号关键字short是16为二进制组成,第1位是符号位,表示范围-32768~32767之间unsigned short是16为二进制组成,无符号位, 表示范围0~65535之间
*/ 
int main(){short a=32769;//超出了short的范围 unsigned short b=32769;//在范围内可以正常表示 cout<<"a的值为:"<<a<<endl; //输出不正确 cout<<"b的值为:"<<b<<endl;return 0;
}
/* 
a的值为:-32767 
b的值为:32769
*/

3) 二进制

二进制(Binary)是一种计数系统,它只使用两个数字:0和1。它是计算机科学中最基本的数制,因为计算机内部的所有信息都是以二进制形式存储和处理的

在二进制系统中,每一位的权重是2的幂次方

最右边的位(最低位)的权重是2^0 = 1

从右向左数第二位的权重是2^1 = 2

从右向左数第三位的权重是2^2 = 4

以此类推

二进制数的表示方法是从右向左,每一位的数字乘以其对应的权重,然后将所有的结果相加。例如,二进制数1101转换为十进制数的计算过程如下

1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 8 + 4 + 0 + 1 = 13

4) 位运算

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

左移

左移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;
}

异或运算

异或运算(XOR)是一种基本的数学运算符,应用于逻辑运算,其数学符号为“⊕”,计算机符号为“xor”

异或运算的运算法则为:如果两个值不相同,则异或结果为1;如果两个值相同,则异或结果为0

//示例
2 xor 3 = 1
具体过程如下
2 对应二进制 0010
3 对应二进制 001100100011
xor
----------0001

C++语言中 异或符号为 ^

p^=1等价p=p^1p为0时 p^1=0^1=1
具体过程如下
0对应二进制为 0000
1对应二进制为 000100000001
xor
----------0001p为1时 p^1=1^1=0
具体过程如下
1对应二进制为 000100010001
xor
----------0000

3 思路分析

假设输入的 x 是不超过 65535的自然数,完成下面的判断题和单选题

判断题

1 当输入非零时,输出一定不为零 ( T )

分析

异或运算规则可知,只要异或前后的数字不同就为1
short总共16位,先左移6位,右边补0,左边溢出,其中12位不能为1,如果为1则输出不为0
又右移8位,左边补0,右边溢出,涉及16位都不能为1
所以只有输入为0,输出才为0
因此正确

2 (2 分)将 f 函数的输入参数的类型改为 unsigned int,程序的输出不变 ( F )

分析

unsigned int 为无符号4个字节
unsigned short 为无符号2个字节
如下代码,如果2个字节对应16位二进制short时,会有溢出丢失一些位1的情况
int为4个字节对应32位二进制short时,不会溢出,因此输出结果可能会变
05     x ^= x << 6;
06     x ^= x >> 8;

3 当输入为 65535 时,输出为 63 ( T )

分析

输入65535时,对应二进制为16位二进制都是1
1111111111111111
左移6位
1111111111000000左移前和左移后进行异或运算1111111111111111
^ 1111111111000000
-------------------0000000000111111右移8位0000000000111111>>8=0000000000000000右移前和右移后进行异或运算0000000000111111
^ 0000000000000000
-------------------0000000000111111
转换十进制
2^5+2^4+2^3+2^2+2^1+2^0=2^6-1=63
所以正确

4 当输入为 1 时,输出为 64 ( F )

分析

输入1时,对应二进制为1
000000001
左移6位
1000000左移前和左移后进行异或运算1000000
^ 0000001
-------------------1000001右移8位1000001>>8=0000000右移前和右移后进行异或运算1000001
^ 0000000
-------------------1000001
转换十进制
2^6+2^0=2^6+1=65
所以错误

单选题

5 当输入为 512 时,输出为 ( B )

A 33280
B 33410
C 33106
D 33346

分析

512对应的二进制为
1000000000
左移6位
1000000000000000左移前和左移后进行异或运算1000000000000000
^      1000000000
-------------------1000001000000000
右移8位 10000010右移前和右移后进行异或运算1000001000000000
^        10000010
-------------------1000001010000010对上面二进制转换10进制
2^15+2^9+2^7+2^1
=32768+512+128+2
=33410
所以选B

6 当输入为 64 时,执行完第 5 行后 x 的值为 ( D )

A 8256
B 4130
C 4128
D 4160

分析

64对应的二进制为
1000000
左移6位
1000000000000左移前和左移后进行异或运算1000000000000
^      1000000
---------------1000001000000对上面二进制转换10进制
2^12+2^6
=4096+64
=4160
所以选D

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

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

相关文章

来云栖大会!探展云上开发,沉浸式体验云原生 + AI 新奇玩法

计算馆将展示中国最先进的云计算产业链全景,从底层硬件到数据创新,从云计算基础设施到数据管理服务、人工智能平台和模型服务,全景式呈现 AI 时代云计算最新技术形态和产品进展。2024 云栖大会来了! 本届云栖大会将于 9 月 19 日至 9 月 21 日 在杭州云栖小镇召开 汇集全球…

最后的记录

最后的挣扎但是做的题太少了根本算不上长征。 写这个是因为 NOIP2024 剩百日,这他妈是最后一次了,就让我拿个一等吧,别无所求了。 把之前做过的题都重新总结一遍,怎么说也都能吃透了。 P6880 JOI 2020 Final] オリンピックバス 给一个有向图,经过边有代价 \(C_i\),可以反…

ENSP 某台设备出现乱码的情况

故障现象:新建拓扑没问题,打开其他人发的拓扑就会出现乱码(或者打开ENSP的示例也会出现问题),配置文档正常可以正常导出不受影响。 故障发现时间:2022年底 故障原因:windows系统BUG,常见于inter 13代CPU(例如I5-13500) 处理方法1:重装系统(一劳永逸) 处理方法2:例…

10、Linux文本编辑器

文本编辑器 常见文本编辑器 WindowsNotepad(记事本) Sublime UltraEditLinuxVI/VIM nano Emacs Sed gedit KateVI 和 VIM 的区别VI全称:Visual Interface 创建时间:1976年 创建者:Bill JoyVIM全称:VI IMproved,即 VI 的升级版 创建时间:1991年 创建者:Bram Moolenaar …

vue2 + scss 全局引入 变量使用

百度以及时AI帮助说的配置方式都大差不差,但是我的总是报错,意思就是变量找不到,报错如下 For a guide and recipes on how to configure / customize this project,<br> 然后AI和文章写的vue.config.js的配置内容基本如下module.exports = {css: {loaderOptions: {scss:…

2024金砖大赛网络安全赛项区域选拔赛-简单的rce

1. Echo写入一句话木马蚁剑连接木马根目录下找到flag

Google Colab 简单使用

使用Google Colab需要谷歌账号和一点点魔法。注册好账号,找到我的云盘,可以点击右上角的log 跳转。我的云端银盘这里可以选择上传文件还是文件夹,还可以新建文件夹然后在这个文件夹中选择你要上传的文件。例如我这创建了一个train_test 的文件夹,然后上传了 test_ScVgIM0.z…

Go runtime 调度器精讲(四):运行 main goroutine

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 皇天不负有心人,终于我们到了运行 main goroutine 环节了。让我们走起来,看看一个 goroutine 到底是怎么运行的。 1. 运行 goroutine 稍微回顾下前面的内容,第一讲 Go 程序初始化,介绍了 Go 程序是怎么进入到 runtime 的…

Python网页应用开发神器Dash 2.18.1稳定版本来啦

本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffery/dash-master大家好我是费老师,上周Dash发布了2.18.0新版本,并于今天发布了可稳定使用的2.18.1版本(自古.1版本最稳✌),今天的文章中就将针…

吊打面试官!从多维度理解架构

大家好,我是汤师爷~ 在工作当中,我们经常会听到以下说法:产品负责人说,现在的业务架构太复杂,需要仔细梳理下。 技术领导说,这个项目很复杂,需要做下系统架构方案评审。 研发经理说,这次秒杀活动访问量非常大,需要用到高并发架构方案。 一线研发说,互联网大厂都会用到…

数组的下标越界

1.数组下标 数组的下标通俗来讲是数组中数据的代号,例如a[0]=1,即数组下标0代表1 2.下标越界 假设创建的数组内存为3(a=new int[3]),则数组的下标为0,1,2. 如果多输出了下标3,则会显示下标越界。 1.正常数组的输出2.下标越界的输出(即提示你数组下标越界异常!) 3.数组…

转载:国产操作系统麒麟v10、UOS在线打开excel文件并动态赋值

在实际的开发过程中,经常会遇到数据库中的数据填充到excel生成一份正式文件的功能,PageOffice客户端控件支持在线预览Excel文件时,通过Workbook对象来实现对Excel文件的数据填充功能,如果只是简单的填充一下数据,那么通过调用Sheet对象的openCell方法获取到Cell对象并赋值…