第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
剩下的你自己算吧