2013-01-23 7 views
2

위키 백과에서 순환 버퍼의 사용 가능한 공간을 확인하려면 모듈로 연산이 필요합니다. 그러나 내 구현 단순히 수행모듈로 연산을 사용하지 않는 순환 버퍼

static size_t bytes_used(const ringbuffer* rb) 
{ 
    int d = rb->writer - rb->reader; 

    if (d >= 0) return d; 

    return rb->size - abs(d); 
} 

static size_t bytes_free(const ringbuffer* rb) 
{ 
    return rb->size - (bytes_used(rb) + 1); 
} 

내가 내려다 보이는 해요 뭔가가 있나요, 또는 방법은이 경우 필요하지 와서?

답변

4

아무 것도보고 있지 않습니다. bytes_used의 끝에 오는 조건부 뺄셈은 "가난한 사람의 모듈러스"연산입니다. 그것은 제수의 2 배를 초과하지 않는 숫자에 대해 작동합니다. "실제"모듈러스는 반복되는 뺄셈에 의해 구현 될 수있다.

나머지 크기를 얻기 쉬운 방법은 다음과 같다 :

(rb->writer - rb->reader + rb->size) % rb->size 

그것은 모듈로 연산자를 사용하고, 실행 조건을 회피한다.

P. 귀하의 구현도 간소화 될 수 있습니다 : 마지막 줄의 d이 음수임을 확인하십시오. 따라서 abs(d) is the same as -d`를 준수하십시오. 따라서 쓸 수 있습니다

return rb->size + d; 
+0

당신의 말을 이해하려고합니다. 위의 코드가 작동하지 않는 숫자를 주시겠습니까? 아니면 제수의 2 배를 넘지 않는 숫자를 정확히 의미합니까? – Muis

+0

@ Joshua 'A mod D'를 계산하는 것을 고려하십시오. 'A'가'2 * D'보다 엄격히 적다는 것을 안다면'A'와'D'를 비교할 수 있고, 더 큰 경우'D'를 한 번 뺀 결과를 얻을 수 있습니다. A dasblinkenlight