Arithmetic Right Shift 1101 >> 2、Cracking the Coding Interview 中的错误解法?

Arithmetic Right Shift 1101 >> 2, wrong solution in Cracking the Coding Interview?

(供参考:Gayle Laakmann McDowell 的 Cracking the Coding Interview 第 89 页的 Table)

1101>>2的解法是0011,书上的答案错了吗?因为根据我在网上阅读的内容和 this Whosebug post,我认为它应该是 1111。

我的理由是因为 >> 是一个算术右移,你用最高有效位移动(最左边的位因为它保留负数)。我理解错了吗?

你移动了所有的位,多余的位从末尾掉了下来。因此,您的位向右移动,零从左侧移动以取代它们的位置:

 zeros live here   1101
                  0110 and the 1 falls off the end
                 0011 and the 0 falls off the end

从技术上讲,带符号负数的右移取决于实现, 你必须提供上下文。

作者并没有明确这一点,但显然这不是算术移位...

您没有标记该语言,但在 C 中,signed 值上的移位是实现定义的行为,因此如果本书讨论的是有符号类型,显然它定义了右移符合逻辑。无符号类型的移位总是导致逻辑移位。在大多数其他类似 C 的语言中,例如 Java >> 是一个逻辑移位

另一种可能性是本书省略了最高位,因为您不能在任何语言中使用本机 4 位类型(除非您谈论的是 C++ 或类似语言中的 bitset)。但是在一个字节中只存储 4 位将使高位为零,因此无论右移类型如何,右移总是将位清零

作者的意思是将十进制指针向右移动两位。 应用此 01 "rolls of the end" 时,您将得到 0011.

这与参考第 6 版时 "Cracking the Coding interview" 书中第 89 页的预期结果相符。

在C++中你可以这样写:

#include <bitset>
#include <iostream>
using namespace std;

void main()
{
    int a = 13; // 1101
    bitset<4> x(a);
    cout << x << '\n';

    bitset<4> y(x >> 2);    
    cout << y << '\n';
}

输出:

1101
0011