leetcode-190 reverse bits 비트 연산

3880 단어

문제.


제목: [leetcode-190]

사고의 방향


올라와서 좋은 사고방식이 없어서 비트 연산이 가능하다는 것을 알았다.그러나 어떻게 할지 생각지도 못했다. 문제를 어떻게 풀어야 할지 우선 A를 떨어뜨리고 나서 다시 이야기하자.그래서 다음은 비교적 간단한 방법을 써서 한 수를 2진법으로 바꾸고 반대로 가중환원하면 된다.

코드

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {

        std::string ret = D2B(n);
        uint32_t val = 0;

        for( int i = 32 - 1, base = 1; i >= 0; --i, base *= 2 )
        {
            val += ((ret[i] - '0') * base);
        }

        return val;

    }

private:
    std::string D2B( uint32_t val ){
        std::string ret(32, '0');
        int index = 0;
        while( val )
        {
            int t = val%2;
            val /= 2;

            ret[index++] = ('0' + t);
        }
        return ret;
    }


};

개선된 사고방식: 참자 전에 내가 쓴 문장 [위 연산 조작 총집합] 아래에 코드를 직접 붙인다.

코드 1

class Solution {
public:
    uint32_t reverseBits(uint32_t val) {


        val = ( ( val & 0xAAAAAAAA ) >> 1 )|( ( val & 0x55555555) << 1 );
        val = ( ( val & 0xCCCCCCCC ) >> 2 )|( ( val & 0X33333333) << 2 );
        val = ( ( val & 0xF0F0F0F0 ) >> 4 )|( ( val & 0x0F0F0F0F ) << 4 );
        val = ( ( val & 0XFF00FF00 ) >> 8 )|( ( val & 0X00FF00FF ) << 8 );
        val = ( ( val & 0XFFFF0000 ) >> 16 )|( ( val & 0X0000FFFF ) << 16 );

        return val;
    }
};

좋은 웹페이지 즐겨찾기