算术右移1101> 2,破解编码面试的错误解决方案?

时间:2015-01-17 04:52:10

标签: bit-manipulation bit-shift

(供参考:Gayle Laakmann McDowell破解编码访谈第89页表)

1101的解决方案> 2是0011.这本书的答案是错的吗?因为我从网上和this stackoverflow post读到的内容,我认为它应该是1111.

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

5 个答案:

答案 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)

技术上签名负数的右移与实现有关, 你必须提供背景。