2018年蓝桥杯省赛 填空题 1.明码 知识点:进制问题

1.明码 - 蓝桥云课 (lanqiao.cn)

解析:201803明码_哔哩哔哩_bilibili

首先每行读入32个数字,我们分别用x和y各读入16个 ,表示字迹和底色。

我们需要做的就是把字迹的16个数字转为2进制,底色的16个数字转为2进制,然后2进制中的1用'1'来表示字迹,2进制中的0用' '来表示底色。合起来 组成汉字。

Tisps

+127的二进制是:0 1 1 1 1 1 1 1 (符号位为0不能改),也就是正数的八位二进制最大就是127

-1的二进制是: 1 0 0 0 0 0 0 1,取反+1变为:1 1 1 1 1 1 1 1

我们发现和127的二进制一样(除了符号位)

那么-1的二进制我们可以通过按位与上 127的每一位取判断有多少个1(不判断符号位),就相当于求-1的八位二进制有多少个1(因为二者除了符号位不一样外其他都一样)

2的二进制是: 1 0 0 0 0 0 1 0,取反+1之后是:1 1 1 1 1 1 1 0

126的二进制是:0 1 1 1 1 1 1 0

我们发现发现也可以用同样的方法 通过求126的八位二进制有多少个1去求出-2的八位二进制有多少个1.

总结,因此对于负数,我们可以通过 128+(负数)>>(1~30)&1==1的方式求出负数的二进制位。

code

js 复制代码
#include<bits/stdc++.h>
using namespace std;

void toBinaryStr(int i,string& ans)
{
    //正数部分
		if(i>0)
		{
		
			for(int j=0;j<7;j++)  //一个字节一个字节的进行转化 
			if(((i>>j)&1)==1) 
			{
				ans[8-j-1]='1'; //从高位到低位赋值 
			} 
		}
		//负数部分 
		else
		{
			 
			 for(int j=0;j<7;j++)
			 {
			 	if((((128+i)>>j)&1)==1)
			 	{
			 		ans[8-j-1]='1';
				 }
			 }
		}
} 
int main()
{
	
	for(int i=0;i<10;i++)  //一共10行 
	{
		for(int j=0;j<16;j++)  //每行32位,但是字迹和底色各占一半 ,所以字迹和背景各占16位 
		{
			int x,y;cin>>x>>y;
			string x1="        ",y2="        ";  //背景,每个占八位 
			
			//转换为二进制 
			toBinaryStr(x,x1);	
			toBinaryStr(y,y2);	
			
			cout<<x1+y2<<endl;
		}
		cout<<endl<<"================================================="<<endl;  //分割,方便清晰 
	}
	
        
        //求9的9次方
	long long ans=9;
	for(int i=0;i<9;i++)
	{
		ans*=9;
	}
	cout<<ans;
	return 0;
 } 
相关推荐
罗西的思考11 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer11 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
高晶13 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy13 小时前
大数计算思路
算法
高晶13 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗13 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李13 小时前
反向传播计算梯度举例
算法
niyongsheng13 小时前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
302wanger14 小时前
DeepSeek-V4.1-Flash-1017 免费用到1024,速来
算法
lisw0514 小时前
微分与积分的本质区别解析
算法·数学建模·极限编程