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;
 } 
相关推荐
算AI8 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh10 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之11 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓11 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf11 小时前
图论----拓扑排序
算法·图论
我要昵称干什么11 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ12 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl12 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦12 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku12 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯