2013-12-21 3 views
0

캐리 저장 연산은 하드웨어 속도의 제한 요소 인 캐리 전달을 피하기 위해 "가상 합계"를 보유하는 비트 수 두 번을 두 번 사용합니다. .오른쪽으로 이동 저장 값을 이동합니다.

나는이 수를 2의 거듭 제곱으로 나누어야하는 시스템을 가지고 있지만 단순히 두 숫자를 모두 오른쪽으로 시프트하는 것이 모든 경우에 작동하지는 않습니다. 2 개의 16 비트는 당신이 4000를 생성하기 위하여 추가하는 수를 저장한다, C001는 가상 합계이다, 7FFF는 가상 운반이다.

C001 + 7FFF = 4000 (discard overflow bits) 
but after right shift 
6000 + 3FFF = 9FFF (when it should be 2000) 

간단히 말해서 캐리 저장 번호를 2의 제곱으로 나눕니 까? (캐리 저장 번호를 유지하는 동안)

+0

라인의 의미를 설명 할 수 있습니까? c001 7fff = 4000은 무엇을 의미합니까? –

+0

조금 더 추가했습니다. 모든 작업 후에 가상 캐리 및 가상 저장을 추가하여 일반 이진수 – StanOverflow

답변

1

먼저 오른쪽으로 1 시프트하면 나머지를 잊어 버리고 2만큼 삭제됩니다. 그러나 나머지는 정확한 결과를 얻기 위해 필요할 수 있습니다. 예를 들어 C000을 8000에 추가하거나 C002를 7FFE에 추가하여 초기 예제를 변경하십시오. 둘 다 같은 합계를 제공하지만, 이동 된 값의 합은 9FFF가 아니라 A000입니다. 그리고 이것은 확실히 정확합니다. 따라서 LSB의 합이 손실 될 수있는 경우에만 이러한 시프 팅을 수행 할 수 있습니다. 2 summand와 1 bit shift가있는 경우, 이것은 하나의 summand가 LSB에 1을 가질 수 있음을 의미합니다.

둘째, 이것이 고정되어 있고 A000이 있다고 생각해보십시오. 간단한 이상적인 수학은 (a + b)/2 == a/2 + b/2라고 말합니다. 귀하의 경우 처음에 무시한 캐리 비트의 무게는 0x10000이지만 1 씩 이동 한 후에는 0x8000입니다. A000이 예상되는 2000과 어떻게 다른지 정확히 알 수 있습니다. 따라서 메서드의 다른 측면에서 확실하다면 ~ 0x8000 == 0x7FFF와 논리적 AND로 끝내십시오.

+0

을 얻습니다. 오른쪽에 캐리를 잃지 않고 버려 졌는지 확인해야합니다. 왼쪽에. – StanOverflow

+0

감사합니다. – StanOverflow

0

표현을 수정하여 이동 가능하도록하는 기술이 있습니다. 이것은 Tobias Noll의 "고속 디지털 신호 처리를위한 Carry-save 아키텍처"라는 논문에서 기인합니다. 사용자는 '= c_out

S'

C로 반송 및 합 벡터의 새로운 부호 비트를 계산할 수 = S XOR C XOR c_out S 및 C는 원래 사인 비트 c_out는

캐리 - 세이브 (carry-save) 추가에서 버려진 캐리 비트 (carry-bit)이다.