C언어 프로그래밍 질문 드립니다.

킴듸   
   조회 4657   추천 0    

 모 대학 2학년 컴퓨터공학부 재학중인 학부생입니다.

다름이 아니라 이번에 전공책 과제를 하던 중 도저히 제 상식으로 풀 수 없는 문제를 마주하여서 찾고 찾다 결국 제야의 고수들이 서식하시는 2cpu에서 여쭤봅니다.

 순수하게 문제에 쏟은 시간만 5시간이 넘는데, 도무지 길이 안보이네요.. 힌트라도 조금만 주시면 감사하겠습니다..ㅠㅠ


문제는 이러합니다.








2.61과 2.62 문제인데요, 얼핏 보면 '어라 너무 쉬운데?' 하실까봐 부연설명 드립니다. 이 문제는 비트, 논리와 산술연산에 대한 이해를 높이려고 출제된 문제입니다. 따라서 다음과 같은 제한사항이 존재합니다..ㅠㅠ







네. 보이시나요. 조건문, 루프, 함수호출 나눗셈 곱셈 등이 제한되어서 뭐 손도 못 대고있습니다... 그나마 삽질로 알아낸건 형 변환을 잘 써먹으면 될 것 같은데 그마저도.. 제 머리로는 끝마칠 수가 없네요.. 도움 부탁드립니다.



짧은글 일수록 신중하게.
/* Get most significant byte from x */

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;

}

비트 연산이라고 합니다.
즉 변수의 값이 들어오면 변수의 값이 어떻게 되나 확인하고 비트 라이트로 몇번째 의 값이 작은지 큰지 물어 보고 값을 리턴 하는것입니다.

비트연산 이라고 한번 검색해보세요..
     
킴듸 2017-09
네.. 말씀하시는 것이 무엇인지는 아는데.. 구현하는게 너무 어려워서 여쭤본 것입니다. 어쨌든 도움 감사합니다ㅠㅠ
오홍식 2017-09
첫번째 문제는 비교문 사용 불가 옵션인데 마지막 사진에는 허용이네요..
따로 쓰지 말라는 비교문 법칙이 그 표현을 쓰지 말라는것이면 문제 자체는 그냥 귀찮은 조건이 달려있는 수준입니다..
c계열이라면 if(a)일 경우 a가 0이 아니면 TRUE로 만들수 있으니 조건 자체를 그냥 비트 연산으로 하라는 문제로 보입니다..
int를 모두 0으로 채우는건 unsigned int b = 0이면 되고..
int를 모두 1로 채우는건 위에서 b-1하면 되고..
lsb나 msb는 그냥 1이나 -1을 대입하고 시스템에 따라 적당한 비트를 0으로 마스크 시켜 재 확인하면 될겁니다.,.
우측 시프트를 취한다는 문제 자체는 이해가 되지 않습니다.. 리틀/빅엔디안인가.. 그거면 포인터 확인해서 msb나 lsb의 위치 확인만 하면 되는것 같습니다.
     
킴듸 2017-09
네 제가 순서를 이상하게 해놔서 조금 오해가 있었군요ㅜㅜ 3 4번 사진이 먼저 조건으로 붙고 나중에 1 2번 사진이 있는 거라서.. 말씀하신건 다 못 사용하는듯 싶네요
비트 연산...
제가 무지 즐기던 종목이네요 ㅎㅎ

and or xor not 등의 게이트들만으로 모든 연산은 가능하니까요... 근데 문제를 읽었는데 뭘 하라는건지 잘 모르겠어요 ㅠㅠ 죄송합니다... 좀 쉽게 풀어서 문제를 적어주시면...

c function 으로 만들어 드리겠습니다 ㅋ
     
킴듸 2017-09
크크 저도 잘 모르겠어요.. ㅋㅋㅋㅋㅋㅋㅋㅋ
쉽게 풀어서 얘기하면 음..
2.61 문제는
a번 문제에서, 만약 인풋이 -1이면, 즉 최상위 부호비트를 포함한 비트가 모두 1이면 리턴값이 1이 나오면 되고 인풋이 양수라서 최상위 부호비트가 0이 되거나 나머지 부호비트가 0이되면 리턴이 0이 되는 프로그램을 짜는 것입니다. 제가 설먕을 잘 못해서ㅠㅠ 이해하셨나요?

 c와 d번 문제는 번역이 좀 별로라서 저도 이해하는데 애먹었네요. d번은 최상위 부호비트를 포함한 바이트의 모든 비트. 즉, 상위 8개의 비트를 말합니다.
c번은 반대로 상위 8개를 제외한 모든 비트를 말합니당. 이해하는데 도움이 되셨을지 모르겠네요...ㅜㅜ

2.62문제는 리틀엔디안 빅엔디안에 따른 연산의 차별성에 관련해서 나온 문제인것같은데 저도 이해가 잘 안가서 손을 못대고있네요.. 2.61이라도 도움 주시면 감사하겟습니당
int badd(int n1, int n2){
    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
좀 low level programming 이군요 이런걸 알아야 사실 전체를 이해하는데 많이 도움이 되지요... 근데 안쓰면 다 까먹는 그런것들...
마이크로코드 같은 것에 적용하면 좋을 것 같은 룰들이네요.
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()를 이용해서 함수호출만 없게하면 될 것 같습니다.
     
킴듸 2017-09
헉 감사합니다.. 과제를 대신 해주시다니 저는 힌트만 바란건데.. 소중히 활용하고 이해안가는 것 있으면 또 댓글달아서 여쭤봐도 될까요
          
이런건 한번 보고 이렇게도 된다는 걸 알면 다음엔 얼마든지 응용이 가능하니까.. 스스로 해결하는 것에 큰 의미는 없을 것 같아요.
여기에 질문하시면 왠만한건 다 해결되는 놀라운 경험을 하실 수 있습니다~
     
킴듸 2017-09
이제보니 너무 간단한 연산이네요... 이걸 너무 오랫동안 고민한 제가 바보가 된 느낌ㅠㅠ 허탈하군요
          
좋~을 때네요. 그나저나 97년생이 대학생이라니.. 제가 94학번인데.. 충격적이네요..
로또번호도 발표되고 나면 왜 내가 이걸 못골랐지 그러지요 ㅋ


QnA
제목Page 3522/5708
2014-05   5143167   정은준1
2015-12   1677359   백메가
2021-06   4572   송주환
2016-05   4572   GodokNam
2021-03   4572   집구석
2007-02   4572   조승현
2017-12   4572   김건우
2015-04   4572   김영기대전
2014-01   4572   jabez033
2016-11   4572   H4CHI
2014-05   4572   몬스
2019-06   4571   니드
2016-11   4571   lovemiai
2016-04   4571   김유중
2007-10   4571   임현규
2014-03   4571   이지포토
2020-04   4571   highend
2018-08   4571   김건우
2016-11   4571   이건희
2018-10   4571   땅부자
2016-04   4571   파란꿈
2017-02   4571   강한구