2016-08-25 3 views
0

나는 (m + n) 비트 곱을 생성하는 m 비트 x n 비트 곱셈에 대해 곱셈이 부호가 없거나 부호가 있든 상관없이 결과의 최하위 비트가 항상 동일하다는 것을 recently learned 있습니다.서명 된 부서와 서명 된 부서의 결과간에 유사점이 있습니까?

(m 비트 몫과 n 비트 나머지를 생성하는) m 비트/n 비트 나누기의 경우 부호가없는 부분과 부호가있는 부분에서 항상 같은 비트가 있거나 일부 입력) 두 가지 방법으로 완전히 다른 결과를 산출합니까?

+0

'1/u-1 = 0'vs '1/s -1 = -1'을 고려해보십시오. – harold

답변

2

피연산자 중 MSB가 설정되어 있으면 (즉, 음수 인 경우) 부호없는 및 부호가있는 구분이 현저히 다릅니다.
두 피연산자의 MSB가 모두 0이면 (즉 양수가 양수이면) 결과는 동일합니다.

부호없는 나누기를 사용하면 피연산자의 모든 비트가 부호없는 것으로 해석됩니다. 즉, 음수는 (매우) 큰 정수로 해석됩니다.

부호가있는 구분을 사용하는 경우 피연산자는 먼저 절대 숫자로 변환되고 피연산자의 부호가 다시 적용됩니다.

mov eax,1 
xor edx,edx  
mov ecx,-1 
div eax,ecx //eax = 0, because the -1 is interpreted as a large positive 
div -1,2  -> $7FFFFFFFF because div 2 shifts bits right by 1. 

수를 다음과 같이

결과이다. 덜 '생각'을 수행하기 때문에 (모든 긍정적 인 피연산자) 일부 프로세서 div에서

mov eax,1 
xor edx,edx //cdq if eax is negative 
mov ecx,-1 
idiv eax,ecx //eax = -1, because 1/-1 = -1. 
idiv -1,2  //-> 0 because 1 shr 1 = 0 and -0 is still 0. 

idiv보다주기 빨라집니다. 그러나 어쨌든 부서가 끔찍하게 느린 작업이라는 사실을 고려할 때 이것은 거의 중요하지 않습니다.

+0

div 앞에있는'xor edx, edx'와 idiv 앞에'cdq'를 잊지 마세요. (ex를 edx로 확장 : eax). 두 번째 예제에서,'eax'를 두 번 썼습니다 (-1/-1 => cdq에 기억한다면 오류를 나눕니다). 또는 부서가 단순한 다른 ISA를 선택하십시오. 또는 8 비트 배당금 ('mov ax, -1' /'div cl') –

1

이전 질문에서이 방법을 배웠습니까? 초등학교 수학으로 돌아가서, 장거리 분할 (어쨌든 나이/느린 (많은 시계) 부문이 작동합니다).

비트 패턴 0b10101010/0b101 (부호없는 0xAA/5 또는 부호 -0x56/-3)을 사용합니다. 나는 속임수를 쓰고 계산기를 사용해야했다. 어쨌든 쉬운 하나의 제

----------- 
101) 10101010 


     100010 
    ----------- 
101) 10101010 
     101 
     === 
     00101 
      101 
      === 
      00 

그래서 결과는 0x22

그러나 우리는 당신이 다음 학년 학교에서 손으로 그것을 얼마나되는 서명 할 필요가 정답을 얻을 수있는 서명 부문입니다 모두 결과가 긍정적 부정적 이었기 때문에 0b1010110

 11100 
    --------- 
11) 1010110 
     11 
     === 
     100 
     11 
     === 
     11 
     11 
     == 
      010 

에 나중에 그래서 우리는 우리가 대신 0b11을 분할하는 0b10101010에 0b101 분할되지 않은 기호를 적용 그래서 대답은가 0x1c 나머지 0x2로입니다.

덧셈/뺄셈 및 부호있는 부호없는 곱셈과 유사하게 나오거나 나오지 않고 나오지 않거나 나오지 않습니다. 부문은 이동 한 후에 동일한 숫자가 반복해서 반복되는 곳에서 곱셈과 같지 않습니다. 당신도 왼쪽부터 시작하지 않습니다. 그래서 저는 그것들 사이에 어떤 종류의 공통적 인 패턴을 만들어 내는지 어떻게 볼 수 없습니다. 위의 내용을 통해 알 수 있듯이, 하나를 무효화하면 많은 공통 비트가 앞당겨지며, 이는 아마도 운이 좋지 않다는 것을 보여줍니다.

나는 덧셈/뺄셈과는 달리 def로 비트 변수 abc를 나누려고하지 않을 것이다. 그리고 그것은 곱셈이나 나눗셈을하지 않았거나 나눗셈을하지만 나눗셈을하지 않은 이유 중 어떤 것인가와 같이 작동하지 않는다. 논리의 많은 부분을 사용하여 곱셈을 더 빠르게 만들 수 있습니다. 아마도 나누기도, 그 또는 많은 시계입니다.

아마도 해커 딜라이트 (Hackers Delight)를보고 분할 단축키를보고 어쩌면 비트의 일부 비율을 동일하게 만드는 패턴이 나타날 수 있지만 의심 스럽습니다. 나누기 로직에 들어가는 실제 이진 피연산자와 아마도 부호있는 또는 부호없는 같은 분자가 될 수있는 상위 비트를 가져야합니다.하지만 두 개의 완전히 다른 숫자를 의미합니다. 위에서 설명한 바와 같이 서명이 다른 표현을 사용하는 동일한 비트 패턴을 가져 와서 동일한 비트 패턴을 부호없는 또는 부호가있는 구분으로 공급하면 분자 및/또는 분모에 다른 비트 패턴이 표시되어 결과가 달라 지므로 일치 할 것으로 예상되는 패턴이 없습니다. . 두 숫자가 양수이면 모두 동일한 결과를 가져야합니다.

+0

제수의 부호 비트는 3 비트이지만 배당의 부호 비트는 8 번째 비트입니까? 그것은 꽤 이상하게 보인다. –