2016-08-19 2 views
2

나누기 연산자 (2로 나누기) 또는 오른쪽 시프트 연산자 (>>) 사이에 사용해야하는 경우가 많았지 만 사용하는 것으로 가정하면 나누기 연산자를 사용하는 경향이 있습니다. 비트 현명한 연산자는 내 코드를 읽기 쉽게 만듭니다. 내 가정은 사실입니까?비트를 사용하면 코드를 읽을 수 없게합니다.

은 좋은 연습 2 완전한 광기를 곱셈이나 나눗셈에 대한 비트 연산자입니다 사용 2.

+1

가장 명확한 것을 적어주십시오. 비트 단위로 생각하지 않는 연산에 대해 비트 단위 연산자를 사용하면 (모든 연산은 비트 단위로 변환됩니다) 어쨌든 명확하지 않은 것처럼 보입니다. – chris

+0

적어도 부호없는 변수의 경우이 최적화는 거의 모든 컴파일러에서 수행됩니다. 그래서 나는 그것을 읽는 것이 더 어렵지 않다고 생각하지만 그것은 당신 팀에 달려 있습니다. 그런데 당신은 읽기 쉽도록'#define'을 사용할 수 있습니다. – MrSmith42

+0

@ MrSmith42,'#define MULTIPLY_BY_TWO (x) ((x) << 1)'이라면,'constexpr int multiply_by_two (int x) {return x << 1; }'int'를 사용자의 필요에 가장 적합한 것으로 바꾸십시오. 물론 거의 모든 컴파일러 중 하나를 사용할 때 여기에 요점이 있습니다. – chris

답변

2

에 의해 생산 코드 대신의 곱에 의해 2 분할에 왼쪽 시프트 연산자 및 오른쪽 시프트 연산자를 사용하는 것입니다.

  1. 부정적인 서명 된 유형의 경우 동작이 정의되지 않습니다. <<.

  2. <<>>은 덧셈과 뺄셈보다 우선 순위가 낮아 표현이 엉망입니다.

  3. 불필요하게 난독 처리됩니다.

  4. 최신 컴파일러를 신뢰하여 적절하게 최적화하십시오. 상기 "상호 일체"및 유용한 모든 종류별로 승산되므로 성능 (두개의 멱수 경우) 우려 안된다 상수 의해

+0

'음수 서명 유형에 대해 정의되지 않음'이라고 말했기 때문에 컴파일러는 부호없는 유형에 대해서만이를 최적화합니다. 따라서 가능한 한 부호없는 유형을 사용하여 컴파일러에서 이러한 최적화를 수행 할 수 있도록하십시오. – MrSmith42

+1

@ MrSmith42 : 그가 말하는 undefinedness는 C 표준에 있습니다. 컴파일러는 기본 하드웨어가 작동하는 방식을 알고 있으며 서명 된 유형 (x86은 예를 들어 산술 및 논리 시프트 코드 모두 제공)에서도 이러한 최적화를 행복하게 적용 할 수 있습니다. 나는 기호가 성능 병목으로 조정 된 것을 본 적이 없으므로, 마이크로 최적화에 대한 모호한 탐색이 아닌 'unsigned'를 사용하십시오 (일반적으로 비트 필드에만 해당). –

+0

@Matteo Italia : 그럼 당신은 상관 관계가있는 코드를 만드는 데 아무런 문제가 없습니까? 나는 프로그램을 작성할 때 특정 컴파일러에 의존하지 않을 것이다. 따라서 부호없는 유형의 경우에만 최적화가 컴파일러에 의해 수행 될 가능성이 높습니다 (아키텍처에 대한 최적화 인 경우). 결과는 예상 한 것입니다 (특정 컴파일러와 독립적입니다). – MrSmith42

2

정수 나누기 정기적으로 비트 시프트에 최적화된다.

중요한 것은 명확하게 의도를 표현하는 것입니다. 정수로 "숫자로"연산하고 그냥 2의 거듭 제곱으로 나누면 나눗셈 연산자를 사용하십시오. 당신이 비트 필드로 정수에서 작동하는 대신 경우

int mean(int a, int b) { 
    return (a+b)/2; // yes overflow blah blah 
} 

- 예를 들어, 당신은 니블을 풀고 당신은 "낮은"위치에 이동하는 4 오른쪽 시프트 필요, 또는 명시 적으로 어떤 비트를 설정해야 -, 다음 비트 연산자를 사용하십시오.

void hex_byte(unsigned char byte, char *out) { 
    out[0]=byte>>4; 
    out[1]=byte&0xf; 
} 

unsigned set_bit(unsigned in, unsigned n) { 
    return in | (1<<n); 
} 

일반적으로 부호가없는 정수에는 부호가있는 정수를 사용하는 것이 가장 일반적입니다.

관련 문제