格式化I/O
#include<iostream>
using namespace std;
void showflags(ios::fmtflags f);
int main()
{
ios::fmtflags f;
f=cout.flags(f);
showflags(f);
cout.setf(ios::showpos);
cout.setf(ios::scientific);
f=cout.flags();
showflags(f);
cout.unsetf(ios::scientific);
f=cout.flags();
showflags(f);
return 0;
}
void showflags(ios::fmtflags f)
{
long i;
for(i=0x4000;i;i=i>>1)
if(i&f)
cout<<"l ";
else
cout<<"0 ";
cout<<"\n";
}
结果是:
0 0 0 0 0 l 0 0 0 0 0 0 0 0 l
l 0 l l l 0 0 l l l 0 l l 0 0
l 0 0 l l 0 0 l l l 0 l l 0 0
程序是按书打的,程序的基本含义我能明白,但是为什么会出这个结果呢?大概是showflags()函数中十六进制的某些地方我还不理解,请各位大哥告知,谢谢~~~~~~
问题点数:40、回复次数:2Top
1 楼du51(郁郁思扬)回复于 2006-02-21 21:46:02 得分 30
大概是showflags()函数中十六进制的某些地方我还不理解,请各位大哥告知,谢谢~~~~~~?
这个程序是显示当前操作符的二进制.另外.0x4000应为0x8000
它在内存中是1000000000000000
任何一个数与它相与得到非零值,说明,它的最高位为1.应该输出1
若为0输出0
然后右移变为0100000000000000
任何一个数与它相与得到非零值,说明,它的第二们应该为1,输出1
若为0输出0
依次后推.直到0000000000000001
这时已经到最后一位了.
这是一个显示二进制的代码.
程序如下会更清晰.
#include<iostream>
using namespace std;
void showflags(ios::fmtflags f);
int main()
{
ios::fmtflags f;
f=cout.flags();
showflags(f);
cout.setf(ios::showpos|ios::scientific);
f=cout.flags();
showflags(f);
cout.unsetf(ios::scientific);
f=cout.flags();
showflags(f);
cout.unsetf(ios::showpos);
f=cout.flags();
showflags(f);
system("PAUSE");
return 0;
}
void showflags(ios::fmtflags f)
{
long i;
for(i=0x8000;i;i>>=1)
if(i&f)
cout<<"l ";
else
cout<<"0 ";
cout<<"\n";
}
结果如下:
/*
0 0 0 l 0 0 0 0 0 0 0 0 0 0 l 0
0 0 0 l l 0 0 l 0 0 0 0 0 0 l 0
0 0 0 l l 0 0 0 0 0 0 0 0 0 l 0
0 0 0 l 0 0 0 0 0 0 0 0 0 0 l 0
请按任意键继续. . .
*/
第一行与第四行一样,分次移除了.也反映了或运算的实质.
Top
2 楼wshcdr(dd)回复于 2006-02-21 21:49:43 得分 10
void showflags(ios::fmtflags f)
{
long i;
for(i=0x4000;i;i=i>>1)
if(i&f)
cout<<"l ";
else
cout<<"0 ";
cout<<"\n";
}
该函数用来在显示f的值啊
Top




