程序员面试宝典1

程序员面试宝典

第十二章位运算与嵌入式编程

1.P161 面试例题3

8个位(bit,简写为b)组成一个字节(Byte,简写为B),《21天学通C++P40 2-2

#include"StdAfx.h"

#include<Windows.h>

#include"../OpenGL/glut.h"

#include<iostream>

#include<fstream>

using namespace std;

#defineBIT_MASK(bit_pos) (0x01<<(bit_pos))

int Bit_Reset(unsignedint* val,unsigned char pos){

if(pos>=sizeof(unsignedint)*8)

{

return 0;

}

*val=(*val&~BIT_MASK(pos));

return 1;

}

int main(int argc, char*argv[])

{

unsigned intx=0xffffffff;

unsigned char y=4;

Bit_Reset(&x,y);

std::cout<<std::hex<<x<<'\n';

getchar();

return 0;

}

2.P161 面试例题2

#include"StdAfx.h"

#include<Windows.h>

#include"../OpenGL/glut.h"

#include<iostream>

#include<fstream>

using namespace std;

struct a{

int x:1;

int y:2;

int z:32;

};

int main(int argc, char*argv[])

{

a d;

double b;

cout<<&d;

//d.z=d.x+d.y;

printf("\n%d %d %d%d\n",d.x,d.y,d.z,sizeof(d));

printf("\n%d\n",sizeof(b));

getchar();

return 0;

}

3. C++中的强制类型转换

1static_cast

1--用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

2--用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

3--把空指针转换成目标类型的空指针。

4--把任何类型的表达式转换成void类型。

2 dynamic_cast

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

3reinpreter_cast

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

4 const_cast

该运算符用来修改类型的constvolatile属性。除了constvolatile修饰之外,type_idexpression的类型是一样的。

常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

4.面试试题5

#include"StdAfx.h"

#include<Windows.h>

#include"../OpenGL/glut.h"

#include <iostream>

#include<fstream>

using namespace std;

int main(int argc, char*argv[])

{

char *p="a";

inti=(int)"a";

int i2=(int)p;

inti5=reinterpret_cast<int>(&p);

cout<<*p<<endl;

cout<<p<<endl;

cout<<&p<<endl;

cout<<i<<endl;

cout<<i2<<endl;

cout<<i5<<endl;

getchar();

return 0;

}

5.基本概念

1)所谓虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。

2)对一个数据可以建立一个引用,它的作用是为一个变量起一个别名。

int a;

int &b=a;

使变量b具有变量a的地址。

6.167页面试试题7

#include"stdafx.h"

#include<iostream>

#include <string>

using namespace std;

class A

{

public:

virtual voidfoo(){cout<<"A foo"<<endl;}

voidpp(){cout<<"A PP"<<endl;};

};

class B:public A

{

public:

voidfoo(){cout<<"B foo"<<endl;}

voidpp(){cout<<"B PP"<<endl;}

voidFunctionB(){cout<<"Excute FunctionB!"<<endl;}

};

int _tmain(int argc,_TCHAR* argv[])

{

B b;

A *pa=&b;

pa->foo();

pa->pp();

(dynamic_cast<B*>(pa))->FunctionB();

(dynamic_cast<B*>(pa))->foo();

(dynamic_cast<B*>(pa))->pp();

(*pa).foo();

getchar();

return 0;

}

7.168页面试试题8

#include"stdafx.h"

#include <iostream>

using namespace std;

int _tmain(int argc,_TCHAR* argv[])

{

unsigned short int i=0;

int j=8,p;

p=j<<1;

i=i-2;

cout<<"\ni="<<i;

cout<<"\np="<<p;

getchar();

return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值