程序员面试宝典——第五章习题解析
来源:互联网 发布: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);}
- 程序员面试宝典——第五章习题解析
- 程序员面试宝典——第五章习题解析
- 程序员面试宝典第五章 程序设计基本概念
- 程序员面试宝典第四版第五章
- 程序员面试宝典部分习题
- 程序员面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念
- 程序员面试宝典——螺旋队列解法解析
- 程序员面试宝典——螺旋队列解法解析2
- 笔记——【程序员面试宝典4】
- 程序员面试宝典(第五版)里的错误
- 华为笔试&程序员面试宝典——选秀节目打分
- 《程序员面试宝典》 —— 多态的作用
- 程序员面试笔试宝典——读书笔记6、操作系统基础知识
- 程序员面试笔试宝典——读书笔记1、程序设计基础知识
- 程序员面试宝典(第四版) —— 类型转换
- C++程序员面试宝典——基本概念易错题
- C++程序员面试宝典——预处理、counst与sizeof
- 程序员面试宝典——子串判断
- 正则表达式
- php函数(不断更新中)
- Android vector.xml 注意点
- 预防数据泄露——音乐播放器Spotify强制用户重置密码
- 理解JavaScript中的this关键词
- 程序员面试宝典——第五章习题解析
- kafka主要参数配置
- pickle错误“MemoryError”
- Delphi 的消息机制
- 【IDE-Visual Studio】灾难性故障(异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))
- UVa 565 - Pizza Anyone?
- Words 2016.9.5
- module_platform_driver(), module_i2c_driver
- codeforces 615B