2010-08-14 8 views
7

나는 코드의 조각이 문에 달렸다 :C#의 ">>"연산자는 무엇을합니까?

Int32 medianIndex = colorList.Count >> 1; 

colorList 클래스 System.Drawing.Color의 목록입니다.

이제 성명서는 목록의 중간 색인과 같은 내용을 검색해야합니다.하지만 그 의미가 어떻게되는지 이해할 수는 없지만 "1"은 중간 값을 부여하는 방법입니다. 색인. 나는 약간 도움을 바랄 것입니다 : S

답변

12

>> 연산자는 bit shift을 수행합니다.

발현 >> 1/ 2 같은 그래서 프로그래머 ** mediancolorList.Count/2 지수를 산출 하였다 * 대부분이다. 이것이 왜 그런지 이해하려면 관련 숫자의 2 진 표현을 살펴 봐야합니다. 정말 당신이 부문은 나쁜 관행 수행 할 때 비트 연산자를 사용하여 일반적으로

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

: 예를 들어, 당신은 25 개 목록의 요소가있는 경우. 프로그래머가 나눗셈 대신 비트 연산을 수행하는 것이 더 빠르다고 생각했기 때문에 아마도 미숙 한 최적화 였을 것입니다. 부문을 작성하는 것이 훨씬 더 명확하고 두 가지 접근 방법의 성능이 비슷하다면 놀랄 일도 아닙니다.

* 표현식 x >> 1은 모든 양의 정수 및 모든 음의 짝수 정수에 대해 x/2과 동일한 결과를 제공합니다. 그러나 그것은 음의 홀수 정수에 대해 다른 결과를줍니다. 예를 들어, -101 >> 1 == -51 인 반면, -101/2 == -50.

** 사실 중간 값은 목록에 홀수 개의 요소가있는 경우에만 정의됩니다. 요소의 수가 짝수 인 경우이 방법은 엄격하게 말하면 중간 값을 제공하지 않습니다.

+0

설명을 주셔서 감사합니다. 저는 시프 팅 방법에 익숙하지만 의미는 있지만 여기 사용 된 방법은 아닙니다. 나는 또 다른 질문을합니다. 2는 일반적인 "/"부분보다 시간 복잡성이 적습니까? – Majd

+0

@Majd : 코드를 실행하는 플랫폼에 따라 다릅니다. C#은 CIL로 컴파일되며,이 CIL은 플랫폼마다 다른 기본 컴퓨터 코드로 변환됩니다 ("jitted"). 일부 지터가 자동으로'x/2'를 시프트 - 오른쪽 명령으로 변환하는 것이 가능할 수도 있습니다. – Timwi

+0

첫 번째 주석에서'x >> 1'과'x/= 2'를 비교하는 것은 약간 혼란스럽고'= '기호는 오타라고 생각합니다. 물론'x >> 1'은'x/2'와 비슷하고'x >> = 1'은'x/= 2'와 비슷합니다. –

0

그것은 기본적으로 단지 모든 비트를 오른쪽으로 이동 한 위치를, 2

>>하여 우측 시프트 연산자 수있다 분할 가독성 코드 아니다.

0110 (6) 0011 (3)

+0

비트. – Timwi

+0

@ Timwi : 고마워, 물론 네 말이 맞아. – dbemerlin

1

>>는 오른쪽 비트 쉬프트 연산자되고, 1만큼 오른쪽으로 이동하면 colorList.CountcolorList.Count/2 더 이하 동일하다.

오른쪽 시프트 a >> ba/2^b으로 정의 할 수 있습니다.

2로 나누기보다는 오른쪽 시프트를 사용하는 이유는 무엇입니까?

+0

2로 나누는 대신 사용하지 마십시오. JIT가 이러한 종류의 것을 최적화합니다. –

2

그것은 비트 단위의 opperator 그냥 http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators에서 움켜 정의 :

이진 연산자 >> 피연산자를 평가하고, 두 번째 인수에 의해 특정 된 비트의 개수에 의해 우측 시프트 된 결과의 첫번째 인자를 반환한다. 첫 번째 인수의 크기를 벗어난 하위 비트를 무시하고 첫 번째 인수의 부호 비트에 새로운 상위 비트를 설정합니다. 첫 번째 인수가 부호없는 경우에는 0으로 설정합니다.

기본적으로 2로 나누어 ...

+0

+1 문서에 연결하는 경우. 나는 우스운 이야기가 방금 정의를 알기 위해 나아가는 대신에 여기에 게시하는 것을 귀찮게했다. 그런 질문을하는 것은 내 직원들에게 그들의 태도에 대해 이야기하게하는 것입니다 (나는 큰 변화가 무엇인지 이해하지 못합니다. "하지만"나는 리뷰하는 코드에 대한 언어 스펙을 찾기에는 너무 게으른 다 "). – TomTom

1

프로그래머 (그 중 20 년 이상 계속 되어온 프로그래머)는 2의 제곱으로 곱하거나 나눗셈을 할 때 비트 시프트를 사용했습니다. 그 이유는 이전 아키텍처 (2MHz 프로세서, 32K 메모리, 디스크가없는 경우) 이동하는 것이 훨씬 빠르며 일반적으로 단일 기계 명령어로 컴파일되었습니다. 비록 내가 주로 C#을 작성했지만, 여전히 습관의 소재로서, 때때로이 트릭을 사용합니다. 대부분의 C# 프로그래머가 본 적이없는 또 다른 공통 C 규칙은 조건부 내에 임베디드 된 임무를 갖는 것입니다. 예를 들어 :

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

어쨌든, 원래의 질문과 그 사용에 대한 이유로, 그들은 대부분 더 이상 모든 바이트 클럭 사이클이 중요 할 수 임베디드 프로그래밍의 제한된 영역을 제외하고 존재하지 않습니다.

관련 문제