(供参考:Gayle Laakmann McDowell破解编码访谈第89页表)
1101的解决方案> 2是0011.这本书的答案是错的吗?因为我从网上和this stackoverflow post读到的内容,我认为它应该是1111.
我的推理是因为>>是一个算术右移,你用最高位移位(最左边的位是因为它保留了负数)。我理解这个错误吗?
答案 0 :(得分:3)
您移位所有位,额外位从末尾开始。所以你的位置正在向前行进,零从左边进入以取代他们的位置:
zeros live here 1101
0110 and the 1 falls off the end
0011 and the 0 falls off the end
答案 1 :(得分:0)
作者没有澄清这一点,但显然它并不是一个算术转换......
答案 2 :(得分:0)
你没有标记语言但是在C中转移签名的值是实现定义的行为,所以如果本书谈的是签名类型,显然它将右移定义为逻辑即可。无符号类型的移位总是导致逻辑移位。在大多数其他类似C语言的Java >>
中都是逻辑移位
另一种可能性是本书省略了最高位,因为你不能在任何语言中使用本机4位类型(除非你在C ++或类似的地方谈论bitset
)。但是在一个字节中仅存储4位将使高位为零,因此无论右移类型如何,向右移位始终使位为零
答案 3 :(得分:0)
作者的意思是移位将小数指针2向右移动。 当应用这个01“结束卷”时,你就会留下0011。
这与参考第6版的“破解编码面试”一书中第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
答案 4 :(得分:-2)
技术上签名负数的右移与实现有关, 你必须提供背景。