我不明白为什么输出它们时两个函数的输出都变为无效:
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;
}
任何人都可以找出原因吗?
答案 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:你说你不喜欢使用调试器,但是如果你只使用了一个调试器,那么你自己就可以很容易找到它。