3

1 つの 32 ビット整数に 4 つの値をエンコードするクラスを作成しようとしています。これまでのところ、何も失うことなくすべての値を保存して出力していますが、何らかの理由で間違った順序になっています。

struct encoder {
    uint32_t val;

    encoder(uint32_t _val = 0) : val(_val) {}

    uint32_t first(uint32_t v = 0) {
        if (!v) return (val << (8*3)) >> (8*3);

        val |= v;
    }

    uint32_t second(uint32_t v = 0) {
        if (!v) return (val << (8*2)) >> (8*3);

        encoder _backupval(val);

        val = (val >> (8*1));
        val |= v;
        val = (val << (8*1));
        val |= _backupval.first();
    }

    uint32_t third(uint32_t v = 0) {
        if (!v) return (val << (8*1)) >> (8*3);

        encoder _backupval(val);

        val = (val >> (8*2));
        val |= v;
        //now restore
        val = val << 8;
        val |= _backupval.second();
        val = val << 8;
        val |= _backupval.first();
    }

    uint32_t fourth(uint32_t v = 0) {
        if (!v) return (val << (8*0)) >> (8*3);

        encoder _backupval(val);

        val = (val >> (8*3));
        val |= v;
        //now restore
        val = val << 8;
        val |= _backupval.second();
        val = val << 8;
        val |= _backupval.first();
        val = val << 8;
        val |= _backupval.third();
    }
};

int main() {
    encoder t;
    t.first(6);
    t.second(42);
    t.third(212);
    t.fourth(23);

    cout << "first number: " << t.first()
         << "\nsecond number: " << t.second()
         << "\nthird number: " << t.third()
         << "\nfourth number: " << t.fourth() << endl;

}

これは演習として行っていることに注意してください。このプログラムは実際のプログラムでは使用されません。そのため、別の方法を提案したり、欠陥を指摘したりしないでください (数値のサイズが 256 を超えると、他の整数が破損するなど)。

4

1 に答える 1

5

で関数の順序を混ぜましたfourth:

uint32_t fourth(uint32_t v = 0) {
    if (!v) return (val << (8*0)) >> (8*3);

    encoder _backupval(val);

    val = (val >> (8*3));
    val |= v;
    //now restore
    val = val << 8;
    val |= _backupval.second();
    val = val << 8;
    val |= _backupval.first();
    val = val << 8;
    val |= _backupval.third();  // this should be called first!
}

これにより、戻り値がスクランブルされます。third最初に呼び出すだけで機能します

uint32_t fourth(uint32_t v = 0) {
    if (!v) return (val << (8*0)) >> (8*3);

    encoder _backupval(val);

    val = (val >> (8*3));
    val |= v;
    //now restore
    val = val << 8;
    val |= _backupval.third();
    val = val << 8;
    val |= _backupval.second();
    val = val << 8;
    val |= _backupval.first();
}
于 2012-08-03T13:37:11.547 に答える