今日做c语言题,问题是输入两个字符,将他们最高四位ASCII码与运算,最第四位异或运算
#include<stdio.h>
int main()
{
char a,b,c,d,e;
scanf("%c%c",&a,&b);
c=(a>>4)&(b>>4);
c=c<<4;
d=(a<<4)^(b<<4);
d=d>>4;
e=c|d;
printf("%c\n",e);
}
我知道还有更好的解决办法,但是为何在这种算法中,诸多提交测试里面,只有''M'' ''R''这两个字符一起输入的时候会产生问题,经过初步测试,问题出现在d变量的异或运算中,而且极有可能是a进行移位运算出现的问题,请问,在移位中,究竟发生了什么。
#include <stdio.h>
int main()
{
char a, b;
scanf("%c%c", &a, &b);
putchar(((a & b) & 0xF0) | ((a ^ b) & 0x0F));
return 0;
}
右移没什么问题,问题出在左移
低4位不应该左移
a & 0x0f就是低4位了,你把它再左移4位,相当于乘以16
问题在于,与运算是基于int型的,有32位,而不是8位,你以为左移了4位之后高位就清零了,其实并没有,所以移了相当于没有移
突然看到以前提问题,我来回答一下我自己吧,问题是因为d右移的时候是逻辑右移,需要unsigned char,否则右移填补的是1