게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
32bit * 32bit = 64bit으로 표현하기 질문.
게시물ID : programmer_16707짧은주소 복사하기
작성자 : 오춘기
추천 : 0
조회수 : 426회
댓글수 : 8개
등록시간 : 2016/04/14 16:52:21
안녕하세요 코딩하다가 막히는 부분이 생겼는데 도저히 모르겠어서...
프로그래머 게시판 여러분들께 도움을 좀 청하고자 합니다.
32bit (signed정수) * 32bit (signed정수) 를 64bit으로 표현하려고 하고 있는데요,
우선 제가 선택한 방법은 
X = 16bit + 16bit , B = 16bit + 16bit으로 쪼갠후에, X,Y파티션 들을 각각 Xh, Xl, Yh, Yl로 잡아서
X * Y = (Xh*Yh *2^32 + Xl*Yh*2^16 + Xh&Yl*2^16 + Xl*Yl)로 하려고 하고 있습니다.
                   1            2               3           4
근데 signed 값을 2개로 쪼갤때는 불편한 점이 많으므로 간단하게 쪼개기 위해서 unsigned로 바꾼다음에,
쪼개고 계산해서 다시 signed정수로 바꾸었는데요, 즉,
각각에서 sign값들을 제거한 후에 unsigned값들끼리의 곱을 한 후, 다시 signed값으로 바꾸어 주는 방식을 썼는데 답이 안맞더라구요ㅠㅠ
어디서 계산에 오류가 나는지 모르겠습니다. 똑똑한 프로그래머 분들 코드에 오류좀 찾아주세요!!

Code --->
unsigned sign_x = x>>31;
unsigned sign_y = y>>31;
unsigned xh = x>>16;
unsigned xl = x&0xFFFF;
unsigned yh = y>>16;
unsigned yl = y&y0xFFFF;
if(sign_x == 1)
{
xh = xh^0xFFFF;
xl = xl^0xFFFF +1;
if(xl == 0) {xh = xh+1;} //아랫 부분에 overflow가 일어난 경우.
}
if(sign_y ==1)
{
yh = yh^0xFFFF;
yl = yl^0xFFFF +1;
if(yl == 0) {yh = yh +1;} //둘중 하나가 음수인 경우에는 bit를 해석하는 방법이 signed과 unsigned이 다르므로
}   // 이렇게 둘다 일단 signed일 경우에는 부호는 양수이고 절대값은 같은 unsigned 값으로
  // 바꿔주었습니다. 
unsigned h_result = xh * yh;
unsigned m_result = (xh * yl) + (xl * yh);
unsigned l_result = xl * yl
h_result = h_result + (m_result>>16);
l_result = l_result + ((m_result<<16)>>16);
if(sign_x != sign_y)
{
h_result = h_result^0xFFFFFFFF;
l_result = l_result^0xFFFFFFFF +1;
if(l_result == 0)
{
h_result += 1;
} //아랫 부분에 overflow가 일어난 경우.
return (h_result, l_result);
}
else{
return (h_result,l_result); //여기서 만약 h_result와 l_result는 합쳐서 unsigned X,Y 곱의 값을 저장하고 있는데,
}   // 원래 X와 Y의 부호가 달랐을 경우에는 다시 절대값은 같고 부호만 반대인 값으로 바꿔주었습니다.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호