:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
05/10/21 01:50
unsigned char a,b,c=1;
int i,carry=0,sum=0; printf("0~255사이의 더할 두 수를 입력하시오\n"); scanf("%d%d",&a,&b); i=0; while (i<8) sum=sum|((a&c)^(b&c)^(carry&c)); // 현재 서메이션 값과 다음비트의 합의 결과를 합산함 // c는 계산할 비트가 몇번째 비트인지를 나타내는 수이며 &연산을 mask의 역할을 함 // (a&c)^(b&c)^(carry&c)는 이전 연산에서 얻어온 캐리와 해당 자리의 비트수를 합산한 결과임 if(carry) // 이전 비트의 연산에서 캐리가 있는경우 carry=carry&(a&c)|(b&c); // 두수의 특정비트의 합과 캐리를 합산 else // 캐리가 없는 경우 carry=(a&c)&(b&c); // 두수의 특정 비트만을 합산 c=c<<1; // 계산할 비트를 나타내는 수를 왼쪽으로 한비트 이동시킴 carry=carry<<1; // 캐리를 저정하는 변수 carry를 왼쪽으로 한비트 이동시킴 i++; sum=sum|carry; printf("합은 %d 입니다\n",sum);
05/10/21 01:52
코드 설명을 쓰는건 쉬운데, 비트 단위의 연산이 이뤄지는 과정을 쓰기는 어렵네요.
논리회로책에서 가산기 부분을 살펴보시면 이해가 빠를 것 같습니다.
05/10/21 01:55
추가로 설명드리면,
^ 연산은 xor연산이구요. 두수가 다른 경우에 1값을 가지고 두수가 같은 경우는 0값을 가집니다. & 연산은 말그대로 AND연산이구요. 두 수가 1,1인 경우에만 1값을 가집니다. | 연산은 OR연산이며 두수중 한개의 수가 1이면 1값을 가집니다. <<연산은 SHIFT 연산인데 수의 각 비트들을 왼쪽으로 지정된 수만큼 이동시키는 연산입니다. 예를 들어 0000101 << 1 이면 0001010 이 되는거죠. 마지막 비트를 채우는 건 좀 어려운 문제라 걍 0으로 채워지는 걸로 했습니다.(그리고 대부분의 시스템에서 0으로 채워지구요.
05/10/21 02:03
제가 쓰고도 제가 이해가 안되네요. ㅡㅡ;;
핵심은 변수 c는 계산할 비트의 mask를 위한 변수이다. carry는 캐리(두 비트의 합산에서 1,1인 경우에 발생함. 즉 올림)를 저장하는 수이다 입니다. 변수 c에 대해서 좀더 설명하자면, 첨에는 1로 되어 있고, 임의의 수 a가 2진수 1010101 이라고 하면 a&c는 0000001이 됩니다. 즉 해당하는 비트만 추출(?)하는 것이 가능하지요. 이후 변수 c가 << 1이 되면 우측에서 두번째 비트만 추출(?)하는 것이 가능해지구요. 이런 형태가 반복되면서 연산이 수행되는 것이죠. 쓸수록 난해해지는군요. ㅡㅡ;; 글재주가 없어서 죄송합니다.
05/10/21 02:35
답변 감사드립니다
지금 공책에 써가면서 보니 대충 이해는 가고있는데요 뺄셈과 곱셈도 해야하는데 문제군요 OTL.. 하나라도 더 이해를 하려고 노력중입니다;;;
|