首页 > 试题广场 >

以下程序执行后控制台输出为? #include

[单选题]
以下程序执行后控制台输出为()
#include <stdio.h>
int f(int n) {
    int i = 0;
    for (int k = 1; k <= n; k *= 2)
        ++i;
    for (int j = i / 2; j > 0; --j) {
        int v1 = (1 << (j - 1));
        int v2 = (1 << (i - j));
        bool flag1 = ((n & v1) != 0);
        bool flag2 = ((n & v2) != 0);
        if (flag1 != flag2) {
            n ^= v1;
            n ^= v2;
        }
    }
    return n;
}

int main(int argc, char* argv[]) {
    printf("%d", f(3456));
    return 0;
}


  • 6543
  • 3456
  • 639
  • 27
<p>全靠猜</p>
发表于 2020-09-29 10:20:05 回复(0)
算出输入数字的比特位数量;
从中间位开始分为左右两个半区,并从中间开始向两边逐位进行以下操作:
若左右对称位值相同,则不做调整;
若左右对称位值不同,则先左位保持原值,右位取反;再右位不变,左位取反;此时即意味着左右对称位交换了值。
最后来看即该函数实现的是按位逆序功能。
    
发表于 2021-03-08 20:47:33 回复(0)
i=初始值为12。
n=3456=2048+1024+256+128;
n根据规律属于递减的。

当j=2时
v1=2
v2=1024
f1=0;f2=1
n=n^v1=n+2;
n=n^v2=n+2-1024;

当j=1时
v1=1
v2=2048;
f1=0;f2=1
n=n^v1=n+1;
n=n^v2=n+1-2048;

n减了有3000多剩下的一定小于c的639,所以选D.
本题主要在于看规律,大致的蒙,准确计算 心算的话不现实。手算又太费时间。
故大致计算是性价比最高的。
发表于 2020-11-12 19:43:16 回复(0)
如之前大佬 吕华 所说, 该函数实现的是 按位逆序, 具体的意思就是: 对有效的数位进行按位逆位后得到的数
即 3456 = 0x00000d80  有效的位是  0xd80 = 1101 1000 0000, 进行逆序就是  0000 0001 1011 = 0x1b
结果是     0x0000001b = 27
只对有效位进行逆序 就是 第一个循环进行的 计算有效位的位数
发表于 2022-03-10 10:07:55 回复(0)
这题,计算量是真的有点大,作考研题都够了,不过考试遇到这个题,估计大多数人都会选择猜
发表于 2021-11-10 22:03:09 回复(0)
这种题目简直有病
发表于 2023-02-03 16:18:27 回复(0)
前提:1.知道异或在这里的使用的目的,2.能将十进制迅速转换为二进制,3.迅速算出i值。4.位运算的数学思想。
思路:利用v1和v2的临界点5和6,利用异或在这里的目的(比第五位小的置1,比第五位大置0),估算答案的可能最大值的,也就是31(1到5位全部置一),只能选D就是了。
改进:更加粗略的估算答案的最大取值,估一个i值(比12大也行),临界点的大概范围(比5大),也行。
编辑于 2023-06-23 16:26:26 回复(1)
函数f(n)功能,n对应的二进制数对称位互换,例:11010,返回01011
发表于 2022-03-02 11:39:55 回复(0)
**看成嵌套循环了,我就说怎么计算量这么大......第一遍算出是1100 0000 0101(3077),又验算了一遍,还是1100 0000 0101(3077),还以为是答案错了,看了评论区才发现第一个for循环没有{}!!!
编辑于 2023-11-24 23:06:45 回复(0)