题目描述:
David刚学了asc码,他突然很好奇如果按照某一个规则打乱asc码,会发生什么。输入两个字母a,b,将a,b的二进制asc码最低四位进行“异或”运算,最高四位进行“与”运算,组成一个新的asc码,将其对应的字符输出出来。要求只能使用位运算(如左移、右移、与、或、非、异或),不能使用算术运算。
输入格式:
第1行输入2个字符a,b(无空格隔开)
输出格式:
输出计算后得出的字符
样例输入:
iX
样例输出:
A
数据范围:
a,b为英文大小写字母,且数据保证结果一定是英文大小写字母
# include<stdio.h>
/*David刚学了asc码,他突然很好奇如果按照某一个规则打乱asc码,会发生什么。
输入两个字母a,b,将a,b的二进制asc码最低四位进行“异或”运算,最高四位进行“与”运算,
组成一个新的asc码,将其对应的字符输出出来。要求只能使用位运算(如左移、右移、与、或、非、异或),不能使用算术运算。
输入格式:1行输入2个字符a,b(无空格隔开)
输出格式:出计算后得出的字符
样例输入:iX
样例输出:A*/
int main()
{
unsigned char a, b, a1, a2, b1, b2, c;//chr范围-128-127,如果移位后最高位为1,会溢出,故用无符号
scanf("%c%c", &a, &b);
a1 = a >> 4;//右移4位截断低4位
a1 = a1 << 4;//再左移使高位还原
a2 = a << 4;//左移4位截断高4位
a2 = a2 >> 4;//再右移使高位还原
b1 = b >> 4;
b1 = b1 << 4;
b2 = b << 4;
b2 = b2 >> 4;
c = a2 ^ b2;//低位由于用异或,所以被补足0的部分会改变为1
c = c << 4;//通过左右移将这部分截断
c = c >> 4;
printf("%c\n", c + (a1 & b1));//这样得到的低位高位相加就得到新的ASC
return 0;
}