簡體   English   中英

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

[英]What does the “>>” operator in C# do?

我在一段代碼中遇到了這個聲明:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM