Java 位移位操作选择

Java 位移位操作选择,java,bit-manipulation,Java,Bit Manipulation,大家好,我正在学习java编程,我想知道为什么选择 符号位传播是“>>”而不是“>>”? 我假设>应该有相同的实现。 抱歉,如果这听起来像个愚蠢的问题:) 提前谢谢 这个问题实际上是关于阅读詹姆斯·戈斯林的思想:-)。但是我的猜测是,在数学上都是有意义的:导致一个数字除以2——当你进行符号传播时,无论这个数字是正的还是负的,这都是有效的。也许语言设计者认为右移比传播0的运算符更常用,当整数被视为比特串而不是实际数字时,右移更有用。无论是“正确”还是“错误”,如果戈斯林那天早上吃了不同的东西,他可

大家好,我正在学习java编程,我想知道为什么选择 符号位传播是“>>”而不是“>>”? 我假设>应该有相同的实现。 抱歉,如果这听起来像个愚蠢的问题:)


提前谢谢

这个问题实际上是关于阅读詹姆斯·戈斯林的思想:-)。但是我的猜测是,
在数学上都是有意义的:
导致一个数字除以2——当你进行符号传播时,无论这个数字是正的还是负的,这都是有效的。也许语言设计者认为右移比传播0的运算符更常用,当整数被视为比特串而不是实际数字时,右移更有用。无论是“正确”还是“错误”,如果戈斯林那天早上吃了不同的东西,他可能会看到你的方式……< /P> < P>这种方式的原因是因为C和C++在java之前使用了<代码> <左移代码>代码> <代码>。这些语言同时具有有符号和无符号类型,对于有符号类型,符号位在右移的情况下传播


java没有无符号类型,所以他们保持C和C++的行为,以免造成混乱,招致世界各地开发者的不朽愤怒。然后,它们包括

>
,以提供将位值视为无符号的右移。

让我们从您没有问的问题开始:-)

问:为什么没有

  • >N
    等于有符号整数除以2N
  • >>N
    对于无符号整数等于除以2N
  • 做符号扩展而不是
    >

    答:这真的无法回答。据我们所知,目前还没有公开的原始Oak/Java语言设计决策的同期记录。充其量,我们只能依靠詹姆斯·戈斯林的记忆。。。他愿意回答问题。好了,这个问题还没有被问到

    但我的猜测是,由于Java整数类型(大部分)是有符号的,因此人们认为
    >
    运算符将被更频繁地使用。事后看来,我认为高斯林等人是对的

    <>但是这不是复制C或C++。在这些语言中,只有一个右移运算符(
    >
    ),它对有符号整数的行为是实现定义的!!。Java中的
    >
    操作符就是为了解决这个问题而设计的;即取消C/C+++代码> > <代码>的可移植性问题。 (参考:C11语言规范草案的章节)

    下面是您的评论:

    我假设
    应该有相同的实现。我所说的相同的实现是指相同的过程,但方向相反


    以上就是答案。从有用功能的角度来看,
    >
    符号位仅在右移时起作用。在左移位中,有符号和无符号移位是相同的。非常感谢大家。相同的实现意味着相同的过程,但方向相反(如果这个词在这里不适用,那么很抱歉)。既然>做同样的事情并使用>>>如果你想传播符号位?我不同意关闭这个决定。重复的答案解释了>>和>>>是如何工作的,但它没有解释为什么操作符是按原来的方式选择的,而不是相反的方式选择的,我认为这才是真正的问题。@JohnBollinger
    都将零移入。“相同的实现”是一个错误的术语,但我理解OP想要说的。谢谢Ajb。它并不是真的在读心术。我想可能有技术上的原因。在我看来,如果两个>都具有相同的效果,并且>>>被用于符号位,那么就更容易理解了。语言设计决策通常没有技术原因。这是一个评判性的要求,设计者认为这将使语言更易于使用、更易于阅读、更不容易出错、更强大,而且在许多情况下,这正是设计者认为最漂亮的地方。@Jalearn如果你觉得这个答案有用,你应该通过单击它旁边的绿色大复选标记来“接受”它。看见