您的位置:首页 > 其它

strlen()和swap() 两个函数的实现(特定条件下)。

2011-07-21 12:37 330 查看
/**************************
@author: weedge
@date: 21/07/2011
@comment:
1.不用局部变量和全局变量实现strlen;
参考http://www.cppblog.com/ant/archive/2007/10/12/32886.html
2.有2数据,写一个交换数据的宏
*******************************************/

#include <iostream>
using namespace std;

//========================swap===================================
/*不能处理浮点数*/
#define swap1(a,b) {a=a^b;b=a^b;a=a^b;}

/*会出现溢出情况*/
#define swap11(a,b) {a=a+b;b=a-b;a=a-b;}
#define swap111(a,b) {a=a+b;b=a-b;a=a-b;}

/*单精度浮点数情况*/
#define US(x) (*(unsigned*)(&x)) //按无符号数读取x所在内存单元。
#define swap2(a,b) {US(a) = US(a) ^ US(b); US(b) = US(a) ^ US(b); US(a) = US(a) ^ US(b);}

/*双精度浮点数情况。*/
#define USLL(x) (*(unsigned long long*)(&x)) //按64位无符号数读取x所在内存单元。
#define swap3(a,b)\
{ USLL(a) = USLL(a) ^ USLL(b);\
USLL(b) = USLL(a) ^ USLL(b);\
USLL(a) = USLL(a) ^ USLL(b);}

/*用参数type声明类型。*/
#define swap4(type,a,b) {type temp;temp=a;a=b;b=temp;}

/*用临时内存空间存储。根据不同处理WORD字大小机器而定。32位机sizeof(long double):12*/
#define swap5(a,b) \
{ char tempBuf[12];\
memcpy(tempBuf,&a,sizeof(a));\
memcpy(&a,&b,sizeof(b));\
memcpy(&b,tempBuf,sizeof(b)); }

/*用模板实现*/
template <int N>
struct traits                        //根据字节数得到类型
{
typedef void TYPE;
};

template <>
struct traits<sizeof(float)>         //模板特化
{
typedef unsigned TYPE;
};

template<>
struct traits<sizeof(double)>          //模板特化
{
typedef unsigned long long TYPE;
};

template <typename T>
typename traits<sizeof(T)>::TYPE &Ref(T &x)           //把变量x按另一种类型解释,并返回引用
{
return  reinterpret_cast<typename traits<sizeof(T)>::TYPE&>(x);
}

template <typename T>
void myswap(T &a, T &b)                              //类型转换
{
Ref(a) = Ref(a) ^ Ref(b);
Ref(b) = Ref(a) ^ Ref(b);
Ref(a) = Ref(a) ^ Ref(b);
}

//========================strlen===================================

/*递归实现*/
int str_len(const char *str)
{
if(*str == '\0') return 0;
else return str_len(++str)+1;
}

/*非递归实现*/
char * ToEnd(char * p)
{
while(*p != '\0')
p++;
return p;
}
int mystr_len(char *p)
{
return ToEnd(p)-p;
}

int main()
{
int a = 1;
int b = 2;
float aa = 1.1;
float bb = 2.2;
double aaa = -1.11111;
double bbb = 2.22222;

swap1(a,b);
swap2(aa,bb);
swap3(aaa,bbb);

cout<<a<<" "<<b<<endl;
cout<<aa<<" "<<bb<<endl;
cout<<aaa<<" "<<bbb<<endl;

myswap(a,b);
myswap(aa,bb);
myswap(aaa,bbb);

cout<<a<<" "<<b<<endl;
cout<<aa<<" "<<bb<<endl;
cout<<aaa<<" "<<bbb<<endl;

char *str = "12345";
std::cout<<mystr_len(str)<<std::endl;

//cout<<"sizeof(long double):"<<sizeof(long double)<<endl;

return 0;
}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐