曲径通幽论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: beyes
打印 上一主题 下一主题

面试题目集锦[基本概念]

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
板凳
 楼主| 发表于 2011-11-13 01:05:59 | 只看该作者

求代码的结果

下面的代码结果是什么?
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;


int func (int x)
{
    int count = 0;
    while(x) {
        count++;
        x = x & (x - 1);
    }
    return count;
}


int main()
{
    cout << func(9999) << endl;
    return 0;
}

该段程序的关键在于 x = x & (x - 1); 这条语句上。这里的规律是这样的,当一个数和比它小于 1 的数做与运算时,运算结果末尾连续的 0 的个数比原来的数末尾连续的 0 的个数大 1 。比如 1111 & 1110 结果为 1110 ,1110 比 1111 多出一个 0 ;又如 1100 & (1100 - 1) , 即 1100 & 1011 的结果为 1000 ,1000 末尾连续的 0 的个数为 3 个,而 1100 的末尾连续的 0 的个数为 2 个。换句话来说就是,原来的数如果从开头算起,其连续 1 的个数比从结果连续 1 的个数多 1 个。

在上题中,9999 化为二进制数为 10011100001111 。因此,每一次循环后的结果(x)比原来的数减少一个 1,而多出一个 0,这样一来,func 函数的功能就是计算二进制里包含 1 的数量。所以要最后的输出结果为 8 。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
沙发
 楼主| 发表于 2011-11-13 00:17:04 | 只看该作者

求运算结果

下面程序的输出结果如何:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;


int main()
{
    int x = 2, y, z;
    x *= (y = z = 5);
    cout << x << endl;


    z = 3;
    x == (y = z);
    cout << x << endl;


    x = (y == z);
    cout << x << endl;


    x = (y & z);
    cout << x << endl;


    x = (y && z);
    cout << x << endl;


    y = 4;
    x = (y | z);
    cout << x << endl;
    
    x = (y || z);
    cout << x << endl;
    return 0;
}

运行输出:
./exp2
10
10
1
3
1
7
1
x *= (y = z = 5); 这个语句中,5 赋值给 z ,z 再赋值给 y,然后有 x = x*y; ,所以 x 为 2*5 = 10 。
x == (y = z); 这个语句中,== 符号不是赋值运算符,它只判断左右两边的值是否相等,但不管相等与否,都并不会 x 的值,所以 x 的值仍然为 10 。
x = (y == z); 这个语句中,y == z 的结果要么是 1 要么是 0,所以 x 的结果要么是 1 要么为 0 。因为上面的赋值语句已经令 y 等于 z ,所以这里 x 的值为 1 。
在 x = (y & z); 这个语句中,y 和 z 做按位与运算,且因为 y 和 z 的值都为 3,所以 x 的值也为 3 。
x = (y && z); 这个语句中,只要 y 和 z 同时不为零,那么 x 就为 1,否则 x 为 0 。
x = (y | z); 这个语句中,y 和 z 做按位或运算,此时 y 为 4,z 为 3,所以运算后的结果为 7 。
x = (y || z); 这个语句中,只要 y 或 z 不为 0 ,那么 x 为 1 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-21 02:29 , Processed in 0.075572 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表