首页 > 试题广场 >

以下C程序的输出结果是: int fun1(int i...

[单选题]
以下C程序的输出结果是:
int fun1(int i) {
    return i <= 1 ? 1 : fun1(i - 1) + fun1(i - 3);
}

int fun2(unsigned int i) {
    return ((i >> 8) & 0x64) & (((i << 8) & 0x9346) >> 8);
}

int main() {
    int n = fun2(fun1(101)) % 4;
    printf("%d", n);
    return 0;
}
  • 0
  • 1
  • 2
  • 3
等价于 ((i >> 8) & 0x64) & (((i << 8) & 0x9346) >> 8) % 4 等价于 低八位 11000100 & 10010011 | 00 = 0
发表于 2020-01-02 10:39:07 回复(5)
fun1(101)一看就是指数级别的运算,可以用动态规划优化计算,也可以先从fun1入手,假设i=ABCD,一个字母占8位,
则 i & 0x64 => D&0x64,右侧:C&0x93,即:D&C&0x64&0x93,而后面两个相与等于0
发表于 2020-07-24 00:25:27 回复(3)
这种题只看fun2那里就行了,别的都是幌子。
0x64                  ->   0110 0100
0x9346右移八位 -> 1001 0011
然后你就发现,1和0完美错开了,两次的与操作,得出的就是0。
0%4当然是0
发表于 2020-08-21 21:03:00 回复(1)
重点在
int fun2(unsigned int i) {
    return ((i >> 8) & 0x64) & (((i << 8) & 0x9346) >> 8);
}
整体列一个竖式,按位与.如下:(int前面的高位0我们不管了,我们只考虑最后的16位列竖式
i>>8
i<<8然后>>8
0x64
0x9346>>8
------------
题眼:其实只要计算最后俩,就发现全部为0了,则整体按位与得0.
--------------------------------------------------------------------------------------
ps:
快速16进制转换二进制的方法
9            3            4          6每一个数字转换为4位二进制,从左到右拼接.
1001   0101     0100    0110,然后低8位丢掉1001 0011
同理0x64 后16位  00000000 0110 0100
9346                       000000001001 0011(右移8位,高位补8个0)
所以就是全0,所以结果全0.
发表于 2022-08-06 16:37:22 回复(0)
这种题是真的没有遇到过
发表于 2020-07-27 16:25:52 回复(0)