独習C++ 第2章
三連休があっという間である。
日がな惰眠を貪った三連休であった。
さて、今日はC++の勉強をした。
この分厚い本で勉強している。
問題数が多い。
すべての問題を解こうとしたら、時間がいくらあっても足りないだろう。
第2章の「前章の理解度チェック」からやってみた。
問題3の解答がコンパイラ依存になっている。
つまり、intもlongも32ビット前提の書き方をしている。
コンパイラ依存でないソースを書いてみたので、掲載してみる。
#include <iostream> #include <climits> using namespace std; int rotate(int); long rotate(long); int main() { int a = 0x00000008; long b = 0x80000000; cout << rotate(a) << endl; cout << rotate(b) << endl; return 0; } int rotate(int x) { if ( x >> ( CHAR_BIT * sizeof(int) -1 ) ) { return 1 + (x << 1); } else { return x << 1; } } long rotate(long x) { if ( x >> ( CHAR_BIT * sizeof(long) -1 ) ) { return 1 + (x << 1); } else { return x << 1; } }
ポイントは、2点ある。
一つ目は、climitsをincludeして、CHAR_BITマクロを参照していること。
これによって、1バイトが8ビットでない環境にも対応できる。
これは、次のサイトを参考にした。
www.kijineko.co.jp
二つ目は、sizeof演算子を使って、intやlongのバイト数を求めていること。
これによって、たとえばintが4バイトでも2バイトでも問題なく、思った通りに動いてくれる。