2012-01-04 74 views
0

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

而且相关: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值?
    • 当我们谈论浮动值吗? (我的事情有可能是..但我'不知道。)

答案就像是/否将是不错的:)

感谢。

+0

你试图通过编写测试代码,然后调试它得到这些问题的答案权力被用于划分?这是一种从语言和框架获取“是/否”答案的简单方法。 – Douglas 2012-01-04 20:43:44

+0

这是正确的,在条件。我认为用负数表示>>并不能提供与/相同的结果。你可以只用整数,而不用浮点数。 – 2012-01-04 20:45:04

+2

如果你不确定什么是位移,你可以确定分隔是什么,而你正在考虑将其中一个替换为另一个,为什么不保存自己,未来你和代码的未来维护者(可能你,也许不是你)麻烦和分裂? – 2012-01-04 20:45:15

回答

1

它实际上做你想要的int值,但你应该小心边缘情况,如负数或非常大的数字。

至于浮点数,其内存中的表示并非如此简单,所以一个简单的右移将不会受到2

+0

实际上,浮点类型上没有'>>'运算符。 – phoog 2012-01-04 20:51:09

1

做分割的伎俩这是移位运算符而不是分裂,我们知道,左移将乘以2的数,对于〔实施例

2在基体2是:0010,如果我们移动它的一倍至左它会变成为4或0100

因此,作为MSDN说:

如果第一个操作数是int或uint(32位q (第二操作数& 0x1f)给出移位计数。

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

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

+0

但是这些例子使用右移运算符,它确实类似于分割。 – phoog 2012-01-04 20:50:18