2009-12-25 173 views
4

我无法理解在C#中的代码运营商<<在C#

int i=4 
int[] s =new int [1<<i]; 
Console.WriteLine(s.length); 

的输出中是16 我不知道为什么输出这样呢?

回答

0

< <是左移位运算符

x << y 

意味着移位x至由y位的左边。

3为0011,3 < < 1为0110,其6.

它通常使用2(左移被乘以2)

3

乘以我假设你在意味着ir的地方...

<<n意思是“左移n *位”。由于你从1 =二进制00 ... 00001开始,如果你左移4次,你会得到二进制00 ... 10000 = 16(这有助于你熟悉二进制算术 - 否则“calc.exe”有一个二进制转换器)。

每位向左移动n位,填充(右侧)为0。 * =请注意,n实际上是“Mod 32”,因此对于int,所以(作为角落案例)1 < < 33 = 2,而不是您可能期望的0。

还为-ve int小号>>(右移位),其移动为右,与0填充用于uint s和+已经int s和1

+2

wft在downvote? – 2009-12-25 20:06:59

0

如前所述,< <是左移运算符。在您的具体示例中,阵列大小被定义为2的幂。将值左移一些数字将为1,2,4,8,16 ...

5

来自文档

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

如果第一操作数是长或ULONG (64位量),移位计数是由低阶 第二操作数的6位给出 。

此外,i < < 1和I < < 33给出相同 结果,因为1和33具有相同的 低位5个比特。

这将与2 ^(的低位5位的实际值)相同。

所以在你的情况下,它将是2^4 = 16