程序员面试宝典——第五章习题解析

来源:互联网 发布:java学生成绩 编辑:程序博客网 时间:2024/05/18 04:19

1. P32 面试例题3 以下代码结果是多少

#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-1)这条语句每执行一次,就会把x用二进制格式表示时的最右边的一个二进制1变为二进制0,因为x-1会将该位变为0,所以上述func()函数的功能是计算给定整数x的二进制表示法中1的个数

2. P32 面试例题3 以下代码结果是多少

int main(){    int arr[]={6,7,8,9,10};    int *ptr=arr;    *(ptr++)+=123;    printf("%d,%d\n",*ptr*(++ptr));}

分析:
        int ptr=arr执行之后,ptr指向arr中的第一个元素,即*ptr=6;(ptr++)+=123;语句的执行可以拆分为:ptr=*ptr+123,ptr++,即arr中的第一个元素变为129,并且ptr指向arr中的第二个元素, printf(“%d,%d\n”,*ptr,(++ptr));执行时,从右往左运算,ptr指向第三个元素,所以输出都是8
变形:

void test1(){    int arr[] = { 6, 7, 8, 9, 10 };    int *ptr = arr;    *(ptr++) += 123;    printf("%d,%d\n", *ptr, *(ptr++)); }

3. P35 面试例题1 以下代码结果是多少

int main(int argc, char *argv[]){    float a = 12.5f;    cout << (int)a << endl;//将a的类型转换为int类型,截断小数部分    cout << &a << endl;//获取a在内存中的地址值    //12.5=1100.1=1.1001*2^3(都是1.XXX……,所以1不保存)    //符号位为:0    //中间位为:3+127=130=1000_0010    //尾数位为:1001    //01000001_01001000_00000000_00000000=0x41480000=1095237632    cout << (int &)a << endl;//将浮点数a地址开始的sieof(int)个字节当做整形数输出    cout << ((int)a == (int&)a) << endl;    a = 0.0f;    cout << (int)a << endl;    cout << &a << endl;    cout << (int &)a << endl;//仍然是0    cout << ((int)a == (int&)a) << endl;    system("pause");    return 0;}

分析:
        1)float类型的数据在内存中如何存储
        2)(int &)的含义

4. P36 面试例题2 以下代码结果是多少

int main(int argc, char *argv[]){    unsigned int a = 0xABFFFFF7;    unsigned char i = (unsigned char)a;    unsigned short s = (unsigned short)a;    //小端存储,地位存储在地址值小的地址中    //假设地址为0~3,则:0(f7),1(ff),2(ff),3(ff)    printf("%x\n",i);//f7    printf("%x\n", s);//fff7    char *b = (char*)&a;    printf("%x\n", b);//fffffff7    //&a可以认为是指向unsigned int类型的数据的指针,(char*)&a则把&a强制转换为char*类型的指针,并且这个时候发生了截断,    //截断后指针b只指向0xf7这个数据。又由于指针b是char*类型,属于有符号数,所以输出fffffff7    system("pause");    return 0;}

5. P37 类型转换

        C++ 中类型转换的两个通用原则:1)为了防止精度损失,如果必要的话,类型总是被提升为较宽的类型;2)所有含有小于整型(char、unsigned char、signed char、short)的有序类型的算术表达式在计算之前其类型都会被转换成整型

6. P40 面试例题1 下面程序的输出结果是多少

void test5(){    unsigned char a = 0xA5;    unsigned char b = ~a >> 4 + 1;    printf("b=%d\n", b);}

        分析:a=0xA5=0b10100101,在进行~a操作时,a会进行类型提升,变为int,则a=0x000000A5,取反~a=0xFFFFFFA5,~a>>5=0x07FFFFFA,截断后,b=0xFA=250

7. P41 面试例题2 用一个表达式,判断一个数X是否为2^N次方(2,4,8,16……),不可用循环语句

         分析:2^N的数据具有如下特点:表示为二进制数后,其中之含有一个1,所有要判断一个数X是否为2^N,只需要判断其二进制结果中含有的1的个数是否为1,可以通过表达式X&(X-1),来判断,如果该表达式的结果为0,则说明X为2^N

8. P41面试例题3,下面代码:

int f(int x,int y){    return x&y+(x^y)>>1;}

        分析:x&y对相同位求平均值,(x^y)>>1,对不同位求平均值。例如f(3,5),3&5=1,(3^5)>>1=3,(3+5)/2=(1*2+6)/2=1+6/2=4

9. P42面试例题4:利用位运算实现两个整数的加法匀速,用代码实现

int add(int a, int b){    if (b == 0) return a;    int sum, carry;    sum = a^b;    carry = (a&b) << 1;    return add(sum, carry);}
0 0
原创粉丝点击