【问题标题】:operator >> in C# [duplicate]C#中的运算符>> [重复]
【发布时间】:2012-02-02 18:09:10
【问题描述】:

可能重复:
What does the “>>” operator in C# do?

还相关:Doubling a number - shift left vs. multiplication

这是 C# 中的代码。

我只需要知道我是否正确。

我不确定是否使用运算符>>

这段代码:

winHalfWidth = this.ClientSize.Width >> 1; // both is int

做一样的:

winHalfWidth = this.ClientSize.Width / 2;

如果我是对的,这段代码应该可以:

quaterWidht = this.ClientSize.Width >> 2;

应该与以下内容相同:

quaterWidth = this.ClientSize.Width / 4;

所以 2 个问题:

  1. 对吗?
  2. 使用>>/ 有什么区别吗?
    • 当我们谈论 int 值时?
    • 当我们谈论浮点值时? (我觉得可能有……但我不确定。)

像是/否这样的答案会很好:)

谢谢。

【问题讨论】:

  • 您是否尝试过通过编写测试代码然后对其进行调试来获得这些答案?这是从语言和框架中获得是/否答案的简单方法。
  • 没错,有条件的。我认为对于负数,>> 不会给出与 / 相同的结果。而且您只能将其与整数一起使用,而不能与浮点数一起使用。
  • 如果您不确定位移的作用,您确定除法的作用,并且您正在考虑用一个代替另一个,为什么不拯救自己,未来的你,和你的代码的未来维护者(也许是你,也许不是你)的麻烦,只是分裂?
  • 请参阅在副本中引用的文章中的链接。它描述了 >> 什么时候表现得像除法,什么时候(更重要的是)它不......
  • 我的经验法则是,当你想移动位进行位操作时使用 >,而不是当你想执行算术技巧时,否则它会变得更难维护。

标签: c#


【解决方案1】:

这是移位运算符而不是除法,我们知道左移会将一个数字乘以2,例如

以2为底的2是:0010,如果我们将它向左移动一次,它将变成4或0100。

正如 MSDN 所说:

如果第一个操作数是 int 或 uint(32 位数量),则移位计数由第二个操作数的低五位(第二个操作数 & 0x1f)给出。

如果第一个操作数是 long 或 ulong(64 位数量),则移位计数由第二个操作数的低六位(第二个操作数 & 0x3f)给出。

如果第一个操作数是 int 或 long,则右移是算术移位(高位空位设置为符号位)。如果第一个操作数是 uint 或 ulong 类型,则右移是逻辑移位(高位用零填充)。

【讨论】:

  • 但示例使用了右移运算符,确实类似于除法。
【解决方案2】:

事实上,它确实可以使用 int 值完成您想要的操作,但您应该小心一些极端情况,例如负数或非常大的数字。

至于浮点数,它们的内存表示并不那么简单,所以简单的右移无法完成除以 2 的技巧。

【讨论】:

  • 其实浮点类型上并没有>>运算符。
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多