//: C04:Effector.cpp // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. // Jerry Schwarz's "effectors." #include #include // For max() #include #include using namespace std; // Put out a prefix of a string: class Fixw { string str; public: Fixw(const string& s, int width) : str(s, 0, width) {} friend ostream& operator<<(ostream& os, const Fixw& fw) { return os << fw.str; } }; // Print a number in binary: typedef unsigned long ulong; class Bin { ulong n; public: Bin(ulong nn) { n = nn; } friend ostream& operator<<(ostream& os, const Bin& b) { const ulong ULMAX = numeric_limits::max(); ulong bit = ~(ULMAX >> 1); // Top bit set while(bit) { os << (b.n & bit ? '1' : '0'); bit >>= 1; } return os; } }; int main() { string words = "Things that make us happy, make us wise"; for(int i = words.size(); --i >= 0;) { ostringstream s; s << Fixw(words, i); assert(s.str() == words.substr(0, i)); } ostringstream xs, ys; xs << Bin(0xCAFEBABEUL); assert(xs.str() == "1100""1010""1111""1110""1011""1010""1011""1110"); ys << Bin(0x76543210UL); assert(ys.str() == "0111""0110""0101""0100""0011""0010""0001""0000"); } ///:~