C#中的“>>”运算符有什么作用?

我在一段代码中遇到了这个声明:

Int32 medianIndex = colorList.Count >> 1; 

colorListSystem.Drawing.Color类的列表。

现在声明应该检索列表的中间索引..就像它的半点..但我无法理解>>符号如何工作以及“1”应该如何给出中间索引..我会感激一些帮助:S

>>运算符执行位移 。

表达式>> 1几乎与/ 2相同,因此程序员正在计算索引colorList.Count / 2 ,即**中位数 。 要理解为什么会出现这种情况,您需要查看所涉及数字的二进制表示。 例如,如果列表中有25个元素:

 n : 0 0 0 1 1 0 0 1 = 25 \ \ \ \ \ \ \ n >> 1: 0 0 0 0 1 1 0 0 = 12 

通常使用按位运算符,当你真正想要执行除法时,这是一种不好的做法。 这可能是一个过早的优化,因为程序员认为执行按位操作而不是除法更快。 写一个部门会更清楚,如果两种方法的表现相当,我也不会感到惊讶。

*对于所有正整数和所有负偶数整数,表达式x >> 1给出与x / 2相同的结果。 然而,它给出了负奇数整数的不同结果。 例如-101 >> 1 == -51-101 / 2 == -50

**实际上,如果列表具有奇数个元素,则仅以这种方式定义中值。 对于偶数个元素,这种方法严格来说不会给出中位数。

这是一个按位操作符,我刚刚从http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators中获取了一个定义:

二元运算符>>计算其操作数,并返回由第二个参数指定的位数右移的结果第一个参数。 它丢弃移位超出其第一个参数大小的低位,并将新的高位设置为第一个参数的符号位,或者如果第一个参数是无符号则设置为零。

它基本上除以2 ……

>>是按位右移运算符,将colorList.Count向右移1则或多或少等于colorList.Count / 2

a >> b右移可以定义为a / 2 ^ b

至于为什么你会使用右移而不是除以2,我不知道。

C程序员(其中我已经超过20年)经常使用按位移位乘以或除以2的幂。原因是在旧架构中(想想2 MHz处理器,32K内存,没有磁盘)它的转换速度明显更快,并且通常编译为单个机器指令。 即使我现在主要编写C#,但作为一个习惯,我仍然有时会使用这个技巧。 大多数C#程序员从未见过的另一个常见的C约定是在条件中嵌入了赋值。 例如:

 if ( (a = getmeanumber()) == 0 ) /* do something */ ; 

无论如何,关于原始问题及其使用的原因,它们基本上不再存在,除了嵌入式编程的有限领域,其中每个字节和时钟周期都很重要。

它不是非常易读的代码,基本上它只是将数字除以2。

>>是右移运算符,将所有位向右移位一位。

0110(6)成为0011(3)