2010-10-10 84 views
0

对有符号整数-28进行逻辑右移3运算。什么是正确的答案?对有符号整数进行逻辑右移运算

  1. +203
  2. +83
  3. +3
  4. -3

2的-28补是11100100. 现在,如果我申请逻辑右移操作,我没有得到以上任何一个答案。

+1

你尝试写作和编译代码看?既然我没有和你面谈,我想我会继续回答。 – 2010-10-10 04:35:03

+0

是的,我尝试使用>>>在java中执行此操作,我得到了非常大的数字(536870908)。 – Jagan 2010-10-10 04:41:21

+0

@Jagan使用'(signed int)((unsigned int)-28 >> 3)'在C中得到了相同的结果。如果你仔细想一想,获得一个非常大的正值#是有意义的,因为你已经把曾经是符号位的1变成了第三个最重要的位。 – AlcubierreDrive 2010-10-10 04:53:50

回答

1

我几乎可以肯定这是个诡计的问题。

面试官看到你是否会回答“-3”。如果你有(错误的推理,因为28 >>> 3是3,那么-28 >>> 3是-3),他会意识到你不明白二进制补码。

他希望你回答这四个选择中没有一个是正确的。他希望你

  1. 解释如何逻辑右移, 不像算术右移,通过转动符号 位到幅度
  2. 点的部分将 转小负号变成了一个巨大 正数,答案取决于 使用多少个字节来表示 一个int
+0

但是这是书面测试问题,我没有其他选择:-) – Jagan 2010-10-10 05:15:30

+1

如果这是一个书面测试,你正在采取的过程中,你不能在这里发布它,我不能帮你。 – AlcubierreDrive 2010-10-10 05:16:41

+1

@Jon Rodriguez:我不在考场编写在线考试。我将在1或2个月后参加考试。那么知道我不知道的事情有什么不对? – Jagan 2010-10-10 05:23:27

0

也许,关键是不要假定二进制补码表示。假设sign-and-magnitude表示,答案可以是-3,因为大多数移位实现不涉及符号位。

0

这是一个愚蠢的问题:

  • 无论是0或1的左边添加并没有被普遍为负数定义(维基百科说“悬空位位置填写,一般带零点“ - 我的强调)
  • 所涉及的整数大小没有讨论,并且
  • 有多个使用中的负数的按位表示。

一些语言(如Java我相信)新的最显著位,使得没有一个合适的CPU指令的任何平台将不得不发行数计算所需的答案,而其它语言可作出在CPU本身提供的行为之间实现定义的选择。

2的补数是负数最常见的表示形式。你的问题是“-2的补码是11100100”......我猜这不是问题的一部分(如果是这样,有点奇怪,因为它是在答案之后)。仍然...

如果我们用2的补码运行...

11100100 >> 3 = 00011100 or 11111100 = 28 or -4 

如果表示为1的补:

11100011 >> 3 = 00011100 or 11111100 = 28 or -3 

如果表示为符号位,绝对值:

10011100 >> 3 = 00010011 or 11110011 = 19 or -(127-12)=-115 

(note that the question says a logical bit shift, which by definition ignores any possible interpretation of the bits, so the sign bit is shifted along with others) 

在一个int重新#bits ...我认为这很明显,那会导致一个值太大而不能匹配任何选项,否则它不会有任何区别(如果1被添加到左边1或2的补码),我们可以忽略这个问题。因此,除非我的上述快速计算结果滑落,否则-3是唯一可以在任何合理架构上正确的答案,但仍然不太可能。总之,我想知道他们是不是真的在测试,看看谁有信心不回答问题,或者说没有答案可能是正确的......

0

将有符号的整数移到right可以做很多事情:

  1. 如果数字是负数,它会签名扩展结果(左移1位),这应该使数字看起来像一个较小的负数。
  2. 如果这个数字是正数,那么它会将它移动两位。

但是这种行为在技术上是“实现定义的”。

请看到这个帖子:Are the shift operators (<<, >>) arithmetic or logical in C?