読者です 読者をやめる 読者になる 読者になる

studies

いろいろ勉強用備忘録的な感じ

独習C++ 第2章

三連休があっという間である。
日がな惰眠を貪った三連休であった。

さて、今日はC++の勉強をした。

Amazon CAPTCHA

この分厚い本で勉強している。

問題数が多い。
すべての問題を解こうとしたら、時間がいくらあっても足りないだろう。

第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バイトでも問題なく、思った通りに動いてくれる。