476.数字の補数java

1629 ワード

参照先:https://blog.csdn.net/midnight_time/article/details/79796968
正の整数を指定し、その補数を出力します.補数はその数のバイナリ表現に対して逆をとる.
注意:
  • によって与えられた整数は、32ビット符号付き整数の範囲内で保証される.
  • バイナリ数にプリアンブルゼロビットが含まれていないと仮定できます.

  • 例1:
      : 5
      : 2
      : 5       101(      ),    010。       2。
    

    例2:
      : 1
      : 0
      : 1       1(      ),    0。       0。
    

    答えは次のとおりです.
    class Solution {
        public int findComplement(int num) {
            return  (~num) & (Integer.highestOneBit(num) - 1);
           //   return (~num) & ((Integer.highestOneBit(num)<<1) - 1);
        }
    }

    全然読めません.
             :
    /*		 
     *     1)  Integer.highestOneBit(num) : num            ,         ,
    
     *                                        int    。
     *     2)  -1:         ,       1       0                        
     *                    0      1        
    
    
     *     3) ~ :          
    
     *     4) &:              ,  101 101 * & 010 & 111 *   000   101
     */

    解析,経過1)まずint型numを定義し,計算機に2バイト,1バイト=8ビットを占める,すなわち,5計算機に格納する方式は,1億円101,000万円,
    Integer.highestOneBit(5):5のプリアンブルを含まないバイナリの最上位、すなわち101をとる 1を取って、他のビットはすべて0を補います;100を得る.
    2)100を1つ減らして011にすると、~numと演算し、011桁が足りないため、0を埋める必要がある. 00000000 00000011
    3)~numの意味は、逆を取る、すなわち得る 11111111 11111010    ;
    4)演算:~num:1111111111 11111010
                      &       00000000 00000011
                       得る    00000000 00000010    つまり10進法の2
    参考にしたドキュメントは詳しくて面白いです.
    まとめ:率直な考え方の一つは、整数値をバイナリ形式に変換し、バイナリ数を逆にすることですが、32ビットのバイナリ数を考慮するとint目標数をバイナリの低位に変換する以外は  の左の高い桁数の上の0、これらの0が反対を取ることができないためです  結果として計算できない.