c语言位运算与ASCII吗

今日做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