信息学奥赛初赛天天练-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
相关文章:
信息学奥赛初赛天天练-15-阅读程序-深入解析二进制原码、反码、补码,位运算技巧,以及lowbit的神奇应用
更多资源请关注纽扣编程微信公众号 1 2021 CSP-J 阅读程序1 阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填;除特 殊说明外,判断题 1.5 分,选择题 3 分) 源码 #in…...
期权具体怎么交易详细的操作流程?
期权就是股票,唯一区别标的物上证指数,会看大盘吧,交易两个方向认购做多,认沽做空,双向t0交易,期权具体交易流程可以理解选择方向多和空,选开仓的合约,买入开仓和平仓没了࿰…...
系统架构设计师【第3章】: 信息系统基础知识 (核心总结)
文章目录 3.1 信息系统概述3.1.1 信息系统的定义3.1.2 信息系统的发展3.1.3 信息系统的分类3.1.4 信息系统的生命周期3.1.5 信息系统建设原则3.1.6 信息系统开发方法 3.2 业务处理系统(TPS)3.2.1 业务处理系统的概念3.2.2 业务处理系统的功能 …...
Linux 驱动设备匹配过程
一、Linux 驱动-总线-设备模型 1、驱动分层 Linux内核需要兼容多个平台,不同平台的寄存器设计不同导致操作方法不同,故内核提出分层思想,抽象出与硬件无关的软件层作为核心层来管理下层驱动,各厂商根据自己的硬件编写驱动…...
游戏子弹类python设计与实现详解
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、子弹类设计思路 1. 属性定义 2. 方法设计 三、子弹类实现详解 1. 定义子弹…...
Python基础学习笔记(六)——列表
目录 一、一维列表的介绍和创建二、序列的基本操作1. 索引的查询与返回2. 切片3. 序列加 三、元素的增删改1. 添加元素2. 删除元素3. 更改元素 四、排序五、列表生成式 一、一维列表的介绍和创建 列表(list),也称数组,是一种有序、…...
帝国CMS跳过选择会员类型直接注册方法
国CMS因允许多用户组注册,所以在注册页面会有一个选择注册用户组的界面,即使网站只用了一个用户组也会出现。 如果想去掉这个页面,直接进入注册页面,那么可按以下办法修改 打开 e/class/user.php 文件 查找: $chan…...
【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
黑马es数据同步mq解决方案
方式一:同步调用 优点:实现简单,粗暴 缺点:业务耦合度高 方式二:异步通知 优点:低耦含,实现难度一般 缺点:依赖mq的可靠性 方式三:监听binlog 优点:完全解除服务间耦合 缺点:开启binlog增加数据库负担、实现复杂度高 利用MQ实现mysql与elastics…...
通过LLM多轮对话生成单元测试用例
通过LLM多轮对话生成单元测试用例 代码 在采用 随机生成pytorch算子测试序列且保证算子参数合法 这种方法之前,曾通过本文的方法生成算子组合测试用例。目前所测LLM生成的代码均会出现BUG,且多次交互后仍不能解决.也许随着LLM的更新,这个问题会得到解决.记录备用。 代码 impo…...
[Redis]String类型
基本命令 set命令 将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。 set key value [expiration EX seconds|PX milliseconds] [NX|XX] 选项[EX|PX] EX seconds⸺使用…...
Ai速递5.29
全球AI新闻速递 1.摩尔线程与无问芯穹合作,实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂:机器狗上岗,可“嗅探”故障隐患。 3.ChatGPT:macOS 开始公测。 4.Stability AI:推出Stable Assistant,可用S…...
Android9.0 MTK平台如何增加一个系统应用
在安卓定制化开发过程中,难免遇到要把自己的app预置到系统中,作为系统应用使用,其实方法有很多,过程很简单,今天分享一下我是怎么做的,共总分两步: 第一步:要找到当前系统应用apk存…...
LabVIEW中实现Trio控制器的以太网通讯
在LabVIEW中实现与Trio控制器的以太网通讯,可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收,以及处理通讯中的错误和数据解析。本文将详细说明实现步骤,包括配置、编程…...
C/C++运行时库与 UCRT 通用运行时库:全面总结与问题实例剖析
推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 1. 概述 在开发C/C应用程序时,运行时库(Runtime Library)是不可或缺的一部分。它们提供了一系列函数和功能,使得开发者能够更方便地进行编…...
【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)
1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…...
流形学习(Manifold Learning)
基本概念 Manifold Learning(流形学习)是一种机器学习和数据分析的方法,它专注于从高维数据中发现低维的非线性结构。流形学习的基本假设是,尽管数据可能在高维空间中呈现,但它们实际上分布在一个低维的流形上。这个流…...
区块链技术和应用
文章目录 前言 一、区块链是什么? 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…...
Docker拉取镜像报错:x509: certificate has expired or is not yet v..
太久没有使用docker进行镜像拉取,今天使用docker-compose拉取mongo发现报错(如下图): 报错信息翻译:证书已过期或尚未有效。 解决办法: 1.一般都是证书问题或者系统时间问题导致,可以先执行 da…...
猫狗分类识别模型建立②模型建立
一、导入依赖库 pip install opencv-python pip install numpy pip install tensorflow pip install keras 二、模型建立 pip install opencv-python pip install numpy pip install tensorflow pip install kerasimport os import xml.etree.ElementTree as ETimpor…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
