letecode [190] - ビットリバース

 与えられた32ビット符号なし整数のビットを反転させます。

 例1:

入力:00000010100101000001111010011100 
出力:00111001011110000010100101000000 
説明:入力バイナリストリング00000010100101000001111010011100が符号なし整数43261596を表すので、そのバイナリ表現が00111001011110000010100101000000ある964176192を返します。

例2:

入力:11111111111111111111111111111101 
出力:10111111111111111111111111111111 
説明:入力バイナリストリング11111111111111111111111111111101が符号なし整数4294967293を表すので、そのバイナリ表現が10101111110010110010011101101001ある3221225471を返します。

 

注意:

  • Javaなどの一部の言語では、何の符号なし整数型が存在しないことに注意してください。この場合には、入力と出力の両方は、符号付き整数型として説明すると、整数の内部バイナリ表現は、それは符号の有無と同じであるように、実装に影響を与えるべきではありません。
  • Javaでは、コンパイラが使用して符号付き整数を表し、  2の補数表記をしたがって、入力上記の実施例2に符号付き整数を表し  -3 、出力は、符号付き整数を表します  -1073741825

効果の対象

   32ビットの符号なし2進整数の逆位置を求めます。

理解:

   方法a:間接法

    尾からバイナリ整数nを横断するようになりました。1 N&Nの最後のビットを計算することができる1又は0であり、更新N = N >> 1。

    結果は文字列で逆行を保存されています。各ストリングは32未満の長さがゼロで満たされている場合、n = 0の場合、記憶されている文字列の末尾から読み取ります。

    タイプが可能のuint32_tする文字列を変換します。

  方法II:直接法

    後進位置の後の最初の数は、バイナリ整数である後端にはテールN、直接対向算出逆数値から横断、その設定値* POW(2、インデックス)の逆数です。

コードC ++:

この方法の一つ:

クラス解決{
 パブリック
    のuint32_t reverseBits(のuint32_tのN){ 
        文字列 STR = "" ;
        int型のlen;
        一方、(!N = 0 ){ 
            STR + = to_stringに(N - 1 )。
            N = N >> 1 
        } 
        LEN = str.length()。
        一方、(LEN < 32 ){ 
            STR + = ' 0 ' 
            LEN ++ ; 
        } 
        n個= strtoulを(str.c_str()、NULL、2 )。
        返すのn; 
    } 
}。

方法2:

クラス解決{
 パブリック
    のuint32_t reverseBits(のuint32_tのN){ 
        のuint32_t和 = 0 int型のインデックス= 31 ;
        一方、(N!= 0 ){
             場合(N&1 == 1 ){ 
                合計 + = POW(2 、指数);    
            } 
            索引 - 
            N = N >> 1 
        } 
        戻り値の和。
    } 
}。

結果:

   この方法の一つ:

    ときに実行:4つのMSは、Cに提出するすべてのユーザーの96.81パーセントを打つ++

    メモリ消費量:8.3メガバイトは、Cに提出するすべてのユーザの5.12パーセントを打つ++

  方法2:

    ときに実行:4つのMSは、Cに提出するすべてのユーザーの96.81パーセントを打つ++

    メモリ消費量:8.4メガバイトは、Cに提出するすべてのユーザの5.12パーセントを打つ++

おすすめ

転載: www.cnblogs.com/lpomeloz/p/11009593.html