会员
周边
新闻
博问
闪存
众包
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
weedge
博客园
首页
新随笔
联系
订阅
管理
公告
strlen()和swap() 两个函数的实现(特定条件下)。
Posted on
2011-07-21 12:37
weedge
阅读(
253
) 评论(
0
)
收藏
举报
<pre name="code" class="cpp"><pre name="code" class="cpp">/************************** @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; }
刷新页面
返回顶部
博客园
© 2004-2026
浙公网安备 33010602011771号
浙ICP备2021040463号-3