运营商GT;>和<<输出时输出为空

时间:2011-05-27 19:31:38

标签: c++ operator-overloading bit-shift

我不明白为什么输出它们时两个函数的输出都变为无效:

class uint128_t{

private:
    uint64_t UPPER, LOWER;

public:
    // constructors
    uint128_t(){
        UPPER = 0;
        LOWER = 0;
    }

    template <typename T>
    uint128_t(T rhs){
        UPPER = 0;
        LOWER = (uint64_t) rhs;
    }

    template <typename S, typename T>
    uint128_t(const S upper_rhs, const T lower_rhs){
        UPPER = (uint64_t) upper_rhs;
        LOWER = (uint64_t) lower_rhs;
    }

    uint128_t(const uint128_t & rhs){
        UPPER = rhs.UPPER;
        LOWER = rhs.LOWER;
    }

    //  RHS input args only

    // assignment operator
    template <typename T> uint128_t & operator=(T rhs){
        UPPER = 0;
        LOWER = (uint64_t) rhs;
        return *this;
    }

    uint128_t & operator=(uint128_t & rhs){
        UPPER = rhs.UPPER;
        LOWER = rhs.LOWER;
        return *this;
    }


    uint128_t operator<<(int shift){
        if (shift >= 128)
            return uint128_t(0, 0);
        else if (shift == 64)
            return uint128_t(LOWER, 0);
        else if (shift < 64)
            return uint128_t((UPPER << shift) + (LOWER >> (64 - shift)), LOWER << shift);
        else if ((128 > shift) && (shift > 64)){
            uint128_t a =uint128_t(LOWER << (shift - 64), 0);
            // a will show the correct values 
            std::cout << a.upper() << " " << a.lower() << std::endl;
            return uint128_t(LOWER << (shift - 64), 0);
            // in the program that includes this, printing out the values show 0 0
        }
    }

    uint128_t operator>>(int shift){
        if (shift >= 128)
            return uint128_t(0, 0);
        else if (shift == 64)
            return uint128_t(0, UPPER);
        else if (shift <= 64)
            return uint128_t(UPPER >> shift , ((UPPER << (64 - shift))) + (LOWER >> shift));
        else if ((128 > shift) && (shift > 64))
            return uint128_t(0, (UPPER >> (shift - 64)));
    }

    uint128_t operator<<=(int shift){
        *this = *this << shift;
        return *this;
    }

    uint128_t operator>>=(int shift){
        *this = *this >> shift;
        return *this;
    }

    const uint64_t upper() const {
        return UPPER;
    }

    const uint64_t lower() const {
        return LOWER;
    }

// lots of other stuff

};

int main(){

    uint128_t a(0x123456789abcdef1ULL, 0x123456789abcdef1ULL);

    a>>= 127; // or a <<= 127;
    std::cout <<a.upper() << " " <<a.lower() << std::endl;
    return 0;
}

http://ideone.com/jnZI9

任何人都可以找出原因吗?

3 个答案:

答案 0 :(得分:3)

你的int是128位,你将它向下移位(右)127位,这意味着最高位将移动到最低位置,所有其他位将为0。

但是你的例子中的int是0x1....0x1(最高的半字节)是二进制的0001,它没有设置高位。所以0是正确的输出。

如果您将0x1...更改为0x8...(或任何高于0x7的值),您很可能会在输出中看到0 ... 1。

答案 1 :(得分:2)

>> 127表示移出数字中最右边的127位。由于你的uint128_t是0x1234 ....,最重要的位是'0'。在a >>= 127之后,数字变为0,因此预期输出为0 0


至于<<=,这是因为

uint128_t & operator=(uint128_t & rhs)

与右值rhs不匹配,而

template <typename T> uint128_t & operator=(T rhs)

T == uint128_t时也会匹配,所以在

    *this = *this << shift;

将选择模板赋值运算符,这样只会分配较低的uint64_t。您应该将第一个受让人操作员的签名更改为

uint128_t& operator=(const uint128_t& rhs)
//                   ^^^^^

答案 2 :(得分:0)

原因如下:

UPPER的类型是64位整数。此外,您试图将整数移位63位,在您的情况下第64位为零。所以你丢失了实际持有数字的所有63位。

PS:你说你不喜欢使用调试器,但是如果你只使用了一个调试器,那么你自己就可以很容易找到它。