C语言实验题,这是输入十六进制数字反序输出的程序,每一步求解释,看不懂程序.

如题所述

scanf("%hx",&a);——a=HHHHhhhhLLLLllll
b=a<<12;——b=llll000000000000
c=a<<4&0x0f00;——c=hhhhLLLLllll0000&0000111100000000==0000LLLL00000000
d=a>>12&0x000f——d=000000000000HHHH&0000000000001111==000000000000HHHH
a=a>>4&0x00f0——a=0000HHHHhhhhLLLL&0000000011110000==00000000hhhh0000

a=a+b+c+d=00000000hhhh0000+llll000000000000+0000LLLL00000000+000000000000HHHH=llllLLLLhhhhHHHH
以上H、h、L、l和1都是二进制的一位。由此可知,若输入ABCD的话,输出则是DCBA,刚好把输入的16进制数按位倒过来……
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-04-20
举个例子,比如
a = 0x 5432
那么:
1: b = a << 12 --------> 0x 5432 << 12 = 0x 2000(16进制,一个数代表4位二进制)
2: a << 4 --------> 0x 5432 << 4 = 0x 4320
0x 4320 & 0x 0f00 = 0x 0300
c = 0x 0300
3:a >> 12 ---------> 0x 5432 >> 12 = 0x 0005
0x 0005 & 0x 000f = 0x 0005
d = 0x 0005
4:a >> 4 ----------> 0x 5432 >> 4 = 0x 0543
0x0543 & 0x 00f0 = 0x 0040
a = a + b + c +d = 0x 0040 + 0x 2000 + 0x 0300 + 0x 0005 = 0x 2345
第2个回答  2016-04-20
从sacnf那里说,scanf从标准输入读入值赋给a;
后面的主要涉及两个知识点,左移运算/右移运算,逻辑运算与,这两种运算都是在二进制的层次上运算的。
假如我们输入的是十六进制856,它的二进制是100001010110;
b=a << 12;//a左移12位,就在100001010110后面添加12个0;
c = a << 4 & 0x0f00;//分成两步,先是上移4位,就在100001010110后面添加4个0,然后与16进制的0x0f00(二进制0000 1111 0000 0000)进行与运算,其实和0x0f00与运算的那个数只保留那四个1的位置的数,其他全部抹成0;
右移的话就是直接抹掉,不是换成0,而是直接抹掉。比如1111 0101 0010 >>4 就是1111 0101

剩下的你自己算吧
第3个回答  2016-04-20
请把源码发上来,这样才能方便大家解决你的问题。
第4个回答  2016-04-20
位操作(可自行百度该词条),看了你就明白了。
相似回答