c++ pow 함수 컴패리슨 오퍼레이타와 쓸때…이거 모르겠네…

  • #3776052
    3t 76.***.207.158 840

    경우 1. if (counter & (int) pow(2,j)) // works OK
    경우 2. if (counter == (int) pow(2,j)) // Error! why?

    카운터는 인티저 타입이고,
    위의 둘사이에 뭐가 다른걸까요?

    경우1은 문제없이 잘 결과가 나오는데,
    경우2는 컴파일 에러는 안나지만 예상했던 결과는 안나오는데….

    차이가 뭘까요? j 가 큰것도 아니고 1에서 시작해서 4나 5정도까지 일때요.

    • 75.***.55.103

      operation 순서가 의도한것과 다른게 아닐까 싶네요. 괄호 하나 넣고 시도해보면 어떨까요?
      counter == ((int) pow(2,j)) )

      • 3t 76.***.207.158

        마찬가지로 안되네요

    • 3t 76.***.207.158

      차이를 알았네요. 비트 오퍼레이터 & 를 내가 잘못이해하고 있었군요.
      예를 들면,
      cout<<(5 & (int) pow(2,0)) <<endl;
      cout<<(5 == (int) pow(2,0)) <<endl;

      Out:
      1
      0

    • yyy 161.***.57.14

      잘되는데

    • 지나가다 174.***.208.39

      (Int) pow(2,j) 는 존나 오래걸려서 저리쓰면 혼나고 1 cycle 연산인 1<< j 로 바꿔쓰세요.

      • 3t 76.***.207.158

        그러게요.

        근데 바꾸어쓰면 연산속도가 차이가 얼마나 많이 나나요? 속도 차이가 나는 이유가 어떤 원리에서인가요?

    • ㅁㄴㅇ 98.***.209.54

      5는 00000101
      1은 00000001

      그러니까 5 & 1 은 00000001 이됨. true.

      그런데 5!=1 이니까 당연히 false.

    • 55 24.***.18.91

      연산속도. 수백배 차이남.
      솔까, 님처럼 pow()써서 코딩하는 사람
      8비트 베이직 시절에 쉬프트연산자 없던 시절 이후로, 처음봄.

      • 3t 76.***.207.158

        사실 쉬프트 연산자나 비트오퍼레이터에 익숙치 않아서 암기하기도 힘들고 바로바로 응용하기도 힘들어서 대신 익숙한 파워함수로 한번 테스트 해본겁니다. 그러다보니 원글질문처럼 비트연산자도 다시 생각해볼수있는 기회도 되고 그래서 베이직시절까지 언급하는 댓글들을 통해서 이렇게 쉬프트 연산자에 대해 더 느낌으로 배우게 되네요. 그러면서 몰랐던것도 더 배우는거지요. 그때는 쉬프트연산자가 없엇나보군요?

        근데 Donald E. Knuth. 가 누굽니까?
        가만보니 누군가가 이미 찾은 솔루션공식을 다 그냥 배워 이용하는게 많은거 같은데…그거 자기가 솔루션 찾아낸것도 아닌걸 먼저 배웟다고 잘난체 하는 사람들이 이 분야에선 참 많네요. 물론 빨리 배우는것도 능력인거 같긴 합니다.

Cancel