首先每行读入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;
}