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;
 } 
相关推荐
帅逼码农2 分钟前
有限域、伽罗瓦域、扩域、素域、代数扩张、分裂域概念解释
算法·有限域·伽罗瓦域
Jayen H7 分钟前
【优选算法】盛最多水的容器
算法
机跃13 分钟前
递归算法常见问题(Java)
java·开发语言·算法
<但凡.25 分钟前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯
pzx_0011 小时前
【LeetCode】94.二叉树的中序遍历
算法·leetcode·职场和发展
我曾经是个程序员1 小时前
使用C#生成一张1G大小的空白图片
java·算法·c#
芒果de香蕉皮1 小时前
mavlink移植到单片机stm32f103c8t6,实现接收和发送数据
stm32·单片机·嵌入式硬件·算法·无人机
徐子童1 小时前
二分查找算法专题
数据结构·算法
小王子10241 小时前
数据结构与算法Python版 二叉查找树
数据结构·python·算法·二叉查找树
灰勒塔德2 小时前
Linux-----进程处理(文件IO资源使用)
linux·运维·算法