2진수 나눗셈 코드
#include
#include
int a,b;
int booth(int a,int b); //booth 알고리즘을 이용한 곱셈 함수입니다.
void binary(int number); //십진수를 2진수로 출력 하는 함수입니다.
printf("\n");
printf("곱셈을 하시오\n");
printf("피승수 숫자를 입력하세요. (-8 ~ 7) : ");
scanf("%d", &a);
printf("승수 숫자를 입력하세요. (-8 ~ 7) : ");
scanf("%d", &b);
printf("피승수 는 %d 입니다.\n",a);
printf("승수 는 %d 입니다.\n",b);
if((a>8||a<-8)||(b>8||b<-8)) //값의 범위를 벗어나는경우 종료합니다.
{
printf("입력값오류\n");
exit(0);
}
printf("피승수의 바이너리값\n");
binary(a);
printf("\n");
printf("승수의 바이너리값\n");
binary(b);
printf("\n");
if(b<0){ //b가 음수인경우 앞부분비트들 때문에 값이 정확하게 나오지 않게 됩니다.
b=b+16; //따라서 앞부분비트들을 0으로 만듭니다.
}
booth(a,b); //booth 함수 호출합니다.
printf("\n");
}
void binary(int number)
{
int j, bit;
unsigned int maskbit=0x80; //마스크 비트를 정합니다.
printf(" 십진수 %d 는 ", number);
for(j=1; j<=8; j++) {
bit=(maskbit & number)? 1:0; //마스크 비트와 들어온 숫자와 연산을 하여 1이 //나 0을 찍습니다.
printf("%d",bit);
if((j%4)==0) printf(" ");
maskbit = maskbit>>1; //찍은 다음 당연히 한칸씩 밀어줍니다.
}
}
int booth(int a,int b)
{
int i, q_1=0, q_0, A = 0, buf, M, Q; //각각 레지스터와 초기값을 설정합니다. // 여기에 이미 i가 선언되어 있네요..
M=a<<4; //A의 값을 저장합니다. 단 booth 알고리즘에서 더하는 위치가 기 //존비트의 4번째 앞에서 더하는 연산이므로 편의상 4칸 쉬프트합니다.
Q=b; //b 값을 저장하는 레지스터입니다.
if(((b & 0x01) ? 1 : 0) == 1){ //b의 1번째 비트가 1인경우
q_0 = 1;//1이면 (Q-0)을 1로 정합니다.
}else q_0 =0;//0이면 (Q-0)을 0로 정합니다.
A=A+Q;
printf("(Q-1) (계수)");
for(/*int */i=4; i>0; i--/*;*/){ // 여기서 다시 i를 정의하면 밖에 선언된 i랑 관계가 없어집니다. 세미콜론 없어야 되고요
if(q_0==1 && q_1==0) //(Q-0,Q-1) = (1,0) 인경우입니다.
{
buf=0;
printf("\n(Q-0,Q-1) = (1,0) 이므로 A로부터 피승수를 뺀다.(보수를 취해 더한다.)\n");
buf=(~a)+1; //2의보수화 과정입니다.
buf=buf<<4; //4칸 앞의 비트에 더하는 것이므로 4칸 쉬프트 합니다.
A=A+buf;
printf("(A Q) : ");
binary(A);
printf("%d %d ",q_1,i);
}
else if(q_0 == 0 && q_1 == 1){//(Q-0,Q-1) = (0,1) 인경우입니다.
printf("\n(Q-0,Q-1) = (0,1) 이므로 A로부터 피승수를 더한다.\n");
A = A + M; // A에 피승수를 더합니다.
printf("(A Q) : ");
binary(A);
printf("%d %d ",q_1,i);
}
else if(q_1 == q_0){//(Q-0,Q-1)이 같은경우입니다.
printf("\n(Q-0,Q-1) 같으므로 산술적 우측 쉬프트만한다.\n");
printf("(A Q) : ");
binary(A);
printf("%d %d ",q_1,i);
}
q_1=q_0; // 한칸 쉬프트 하기전에 Q-1 값에 Q-0값을 저장합니다.
A =A>>1; //산술적 우측쉬프트
if(((A & 0x01) ? 1 : 0) == 1){ //마찬가지로 비트를 검사하여 1인 경우 //0인경우 Q-1에 값을 정합니다.
q_0 = 1;
}
else q_0 =0;
}
printf("\n계산종료\n");
printf("(A Q) : ");
binary(A);
printf("%d%d ",q_1,i);
printf("\n결과는 %d 입니다.",A);
printf("\n--------------------------------------------------------------------------------");
이렇게 부호있는 2진 곱셈 알고리즘은 출력했는데 부호있는 나눗셈 2진 알고리즘을 출력을 하려면 어떻게 해야하나요??
몇가지 방법이 있네요.
계산기 (공학용) dec. bin - byte 로 확인
- Shift로 제곱 만큼 이동하는 방법
10*4
4 == 2^2승(제곱)
10<<2 곱하기
10>>2 나누기
- 2진수를 그대로 나눠서 사용하는 방법
____101
___-----
10 1010
___10
___10
_____10
//--------------
이진수 나눗셈 코드
http://kldp.org/node/153699
이진수 나눗셈
http://kin.naver.com/qna/detail.nhn?d1id=11&dirId=1113&docId=181009273&qb=7J207KeE7IiYIOuCmOuIl+yFiA==&enc=utf8§ion=kin&rank=2&search_sort=0&spq=0
http://kin.naver.com/qna/detail.nhn?d1id=11&dirId=1113&docId=228612604&qb=7J207KeE7IiYIOuCmOuIl+yFiA==&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0
이진수의 나눗셈 연산
http://blog.naver.com/canuvis2002?Redirect=Log&logNo=50015083175
[풀어쓰는 C언어 강의] 쉬프트 연산자를 이용한 곱셈, 나눗셈 (2)
http://karmainearth.tistory.com/150
http://karmainearth.tistory.com/156
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기