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
(供参考: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