모 대학 2학년 컴퓨터공학부 재학중인 학부생입니다.
다름이 아니라 이번에 전공책 과제를 하던 중 도저히 제 상식으로 풀 수 없는 문제를 마주하여서 찾고 찾다 결국 제야의 고수들이 서식하시는 2cpu에서 여쭤봅니다.
순수하게 문제에 쏟은 시간만 5시간이 넘는데, 도무지 길이 안보이네요.. 힌트라도 조금만 주시면 감사하겠습니다..ㅠㅠ
문제는 이러합니다.
2.61과 2.62 문제인데요, 얼핏 보면 '어라 너무 쉬운데?' 하실까봐 부연설명 드립니다. 이 문제는 비트, 논리와 산술연산에 대한 이해를 높이려고 출제된 문제입니다. 따라서 다음과 같은 제한사항이 존재합니다..ㅠㅠ
네. 보이시나요. 조건문, 루프, 함수호출 나눗셈 곱셈 등이 제한되어서 뭐 손도 못 대고있습니다... 그나마 삽질로 알아낸건 형 변환을 잘 써먹으면 될 것 같은데 그마저도.. 제 머리로는 끝마칠 수가 없네요.. 도움 부탁드립니다.
int get_msb(int x) {
/* Shift by w-8 */
int shift_val = (sizeof(int)-1)<<3;
/* Arithmetic shift */
int xright = x >> shift_val;
/* Zero all but LSB */
return xright & 0xFF;
}
ºñÆ® ¿¬»êÀ̶ó°í ÇÕ´Ï´Ù.
Áï º¯¼öÀÇ °ªÀÌ µé¾î¿À¸é º¯¼öÀÇ °ªÀÌ ¾î¶»°Ô µÇ³ª È®ÀÎÇÏ°í ºñÆ® ¶óÀÌÆ®·Î ¸î¹ø° ÀÇ °ªÀÌ ÀÛÀºÁö Å«Áö ¹°¾î º¸°í °ªÀ» ¸®ÅÏ Çϴ°ÍÀÔ´Ï´Ù.
ºñÆ®¿¬»ê À̶ó°í Çѹø °Ë»öÇغ¸¼¼¿ä..
µû·Î ¾²Áö ¸»¶ó´Â ºñ±³¹® ¹ýÄ¢ÀÌ ±× Ç¥ÇöÀ» ¾²Áö ¸»¶ó´Â°ÍÀÌ¸é ¹®Á¦ ÀÚü´Â ±×³É ±ÍÂúÀº Á¶°ÇÀÌ ´Þ·ÁÀÖ´Â ¼öÁØÀÔ´Ï´Ù..
c°è¿À̶ó¸é if(a)ÀÏ °æ¿ì a°¡ 0ÀÌ ¾Æ´Ï¸é TRUE·Î ¸¸µé¼ö ÀÖÀ¸´Ï Á¶°Ç ÀÚü¸¦ ±×³É ºñÆ® ¿¬»êÀ¸·Î Ç϶ó´Â ¹®Á¦·Î º¸ÀÔ´Ï´Ù..
int¸¦ ¸ðµÎ 0À¸·Î ä¿ì´Â°Ç unsigned int b = 0ÀÌ¸é µÇ°í..
int¸¦ ¸ðµÎ 1·Î ä¿ì´Â°Ç À§¿¡¼ b-1ÇÏ¸é µÇ°í..
lsb³ª msb´Â ±×³É 1À̳ª -1À» ´ëÀÔÇÏ°í ½Ã½ºÅÛ¿¡ µû¶ó Àû´çÇÑ ºñÆ®¸¦ 0À¸·Î ¸¶½ºÅ© ½ÃÄÑ Àç È®ÀÎÇÏ¸é µÉ°Ì´Ï´Ù.,.
¿ìÃø ½ÃÇÁÆ®¸¦ ÃëÇÑ´Ù´Â ¹®Á¦ ÀÚü´Â ÀÌÇØ°¡ µÇÁö ¾Ê½À´Ï´Ù.. ¸®Æ²/ºò¿£µð¾ÈÀΰ¡.. ±×°Å¸é Æ÷ÀÎÅÍ È®ÀÎÇؼ msb³ª lsbÀÇ À§Ä¡ È®Àθ¸ ÇÏ¸é µÇ´Â°Í °°½À´Ï´Ù.
Á¦°¡ ¹«Áö Áñ±â´ø Á¾¸ñÀÌ³×¿ä ¤¾¤¾
and or xor not µîÀÇ °ÔÀÌÆ®µé¸¸À¸·Î ¸ðµç ¿¬»êÀº °¡´ÉÇϴϱî¿ä... ±Ùµ¥ ¹®Á¦¸¦ Àоú´Âµ¥ ¹» Ç϶ó´Â°ÇÁö Àß ¸ð¸£°Ú¾î¿ä ¤Ð¤Ð Á˼ÛÇÕ´Ï´Ù... Á» ½±°Ô Ç®¾î¼ ¹®Á¦¸¦ Àû¾îÁֽøé...
c function À¸·Î ¸¸µé¾î µå¸®°Ú½À´Ï´Ù ¤»
½±°Ô Ç®¾î¼ ¾ê±âÇϸé À½..
2.61 ¹®Á¦´Â
a¹ø ¹®Á¦¿¡¼, ¸¸¾à ÀÎDzÀÌ -1À̸é, Áï ÃÖ»óÀ§ ºÎÈ£ºñÆ®¸¦ Æ÷ÇÔÇÑ ºñÆ®°¡ ¸ðµÎ 1ÀÌ¸é ¸®ÅÏ°ªÀÌ 1ÀÌ ³ª¿À¸é µÇ°í ÀÎDzÀÌ ¾ç¼ö¶ó¼ ÃÖ»óÀ§ ºÎÈ£ºñÆ®°¡ 0ÀÌ µÇ°Å³ª ³ª¸ÓÁö ºÎÈ£ºñÆ®°¡ 0ÀÌµÇ¸é ¸®ÅÏÀÌ 0ÀÌ µÇ´Â ÇÁ·Î±×·¥À» Â¥´Â °ÍÀÔ´Ï´Ù. Á¦°¡ ¼³¸ÒÀ» Àß ¸øÇؼ¤Ð¤Ð ÀÌÇØÇϼ̳ª¿ä?
c¿Í d¹ø ¹®Á¦´Â ¹ø¿ªÀÌ Á» º°·Î¶ó¼ Àúµµ ÀÌÇØÇϴµ¥ ¾Ö¸Ô¾ú³×¿ä. d¹øÀº ÃÖ»óÀ§ ºÎÈ£ºñÆ®¸¦ Æ÷ÇÔÇÑ ¹ÙÀÌÆ®ÀÇ ¸ðµç ºñÆ®. Áï, »óÀ§ 8°³ÀÇ ºñÆ®¸¦ ¸»ÇÕ´Ï´Ù.
c¹øÀº ¹Ý´ë·Î »óÀ§ 8°³¸¦ Á¦¿ÜÇÑ ¸ðµç ºñÆ®¸¦ ¸»ÇÕ´Ï´ç. ÀÌÇØÇϴµ¥ µµ¿òÀÌ µÇ¼ÌÀ»Áö ¸ð¸£°Ú³×¿ä...¤Ì¤Ì
2.62¹®Á¦´Â ¸®Æ²¿£µð¾È ºò¿£µð¾È¿¡ µû¸¥ ¿¬»êÀÇ Â÷º°¼º¿¡ °ü·ÃÇؼ ³ª¿Â ¹®Á¦ÀΰͰ°Àºµ¥ Àúµµ ÀÌÇØ°¡ Àß ¾È°¡¼ ¼ÕÀ» ¸ø´ë°íÀֳ׿ä.. 2.61ÀÌ¶óµµ µµ¿ò ÁÖ½Ã¸é °¨»çÇÏ°Ù½À´Ï´ç
int carry, sum;
carry = (n1 & n2) << 1; // Find bits that are used for carry
sum = n1 ^ n2; // Add each bit, discard carry.
if (sum & carry) // If bits match, add current sum and carry.
return badd(sum, carry);
else
return sum ^ carry; // Return the sum.
}
int bsub(int n1, int n2){
// Add two's complement and return.
return badd(n1, badd(~n2, 1));
}
** Ãâó
https://stackoverflow.com/questions/12538724/performing-arithmetic-operations-in-binary-using-only-bitwise-operators
2.61.A return !(x ^ -1);
2.61.B return !x;
2.61.C return !((x & 0xff) ^ 0xff);
2.61.D return !get_msb(x);
2.62 return get_msb(x >> 8);
¿¹½Ã·Î »ç¿ëµÈ get_msg()¸¦ ÀÌ¿ëÇؼ ÇÔ¼öÈ£Ã⸸ ¾ø°ÔÇÏ¸é µÉ °Í °°½À´Ï´Ù.
¿©±â¿¡ Áú¹®ÇÏ½Ã¸é ¿Ø¸¸ÇÑ°Ç ´Ù ÇØ°áµÇ´Â ³î¶ó¿î °æÇèÀ» ÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù~