A——ASCII、B——Binary system、B——Bitwise operation 。
前言
背景
cwl是一个大蒟蒻,2024年2月它开启了它的高中生涯,在 WSZX 它邂逅了一群人,其中518宿舍是它中午温暖的归宿。中午在宿舍,小L与cwl聊起了它们各自过去的历史,互相emo了很久,为了打发时间cwl想到了一种加密方式写密文,于是就用它
灵光的脑子推算出了密文。可是小L没有学过相关的知识,它需要你的帮助。在你的帮助下,小L成功加密了文字,它兴奋地拿去给其他舍友看,可它们看到这 n 行01数字却一脸懵。这时一个聪明的舍友略懂一二,一眼就看出了二进制形式,同时它还猜出了这是左移 r 位的结果。可是它觉得太麻烦了,需要你帮助它解密。
加密过程如下:
eg:If the life only like the first meeting.
-
First ASCII码
根据ASCII码表分别对应如下:
-
Second 进制转换
-
十进制转二进制——除二反向取余法
-
二进制转十进制——按“权”展开法
根据进制转换原理对应如下:
-
-
Third 位运算——左移(shl运算)
定义 a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。
左移1位得到如下:
-
Fourth 位运算——按位取反(not运算)
定义 把每一位的0和1全部取反,即1变为0,0变为1。例如,1001按位取反后得到0110。
显而易见的,得到如下:
-
Last
最后就得到
Code 01101101 00110011 00010111 00101111 00110101 00100111 00101101 00110011 00110101 00100001 00100011 00100111 00001101 00100111 00101101 00101001 00110101 00010111 00101111 00110101 00110011 00101101 00011011 00011001 00010111 00100101 00110101 00110101 00010111 00101101 00100011 00110001
Std
可以借助程序实现加密和解密的过程。
#include<bits/stdc++.h>
using namespace std;
int l,r;
void work(char x)
{
stack<int>stk;
for(int i=1;i<=l;i++) stk.push(1);
int a=(int)x;
while(a)
{
stk.push(!(a%2));
a/=2;
}
while(!stk.empty())
{
printf("%d",stk.top());
stk.pop();
}
printf("\n");
return;
}
void jiami()
{
scanf("%d",&l);
string s;
cin>>s;
int len=s.length();
for(int i=0;i<len;i++) work(s[i]);
return;
}
queue<char>q;
void solve(string x)
{
int len=x.length();
stack<int>stk;
for(int i=0;i<len;i++) stk.push(!(x[i]-'0'));
for(int i=1;i<=r;i++) stk.pop();
int sum=0,cnt=0;
while(stk.size())
{
sum+=(stk.top())*pow(2,cnt++);
stk.pop();
}
q.push((char)sum);
return;
}
void jiemi()
{
scanf("%d",&r);
int n;
scanf("%d",&n);
string s[n+10];
for(int i=1;i<=n;i++)
{
cin>>s[i];
solve(s[i]);
}
while(!q.empty())
{
printf("%c",q.front());
q.pop();
}
printf("\n");
return;
}
int main()
{
int op;
scanf("%d",&op);
switch(op)
{
case 1: jiami();
case 2: jiemi();
}
return 0;
}