与えられた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パーセントを打つ++