数が2の累乗で割り切れるかどうかを確認します[重複]

Aug 25 2020

を除算する2の最大乗x、64ビット整数を見つけるか、-1を返します。
ゼロの場合は2の累乗であるため、定義されていません。そのため、メソッドは任意の数を返すことができます。

私はこれにを使ってみBigInteger.getLowestSetBit()ました、それは正しい答えを返しますが、それは最適にはほど遠いです。

例:入力->出力

  • 3-> -1
  • 6-> 1
  • 4256-> 5

回答

6 harold Aug 25 2020 at 00:24

このLongクラスにはnumberOfTrailingZeros、入力が2で割り切れない場合にゼロ(-1ではなく)を返すことを除いて、ほぼ必要なことを実行する便利な静的関数があります。この場合は、さまざまな方法で処理できます。たとえば、@ 0x476f72616eの回答を拡張します

if ((num & 0x1) == 0)
    return Long.numberOfTrailingZeros(num);
else
    return -1;
3 gkab Aug 25 2020 at 00:28

1つのアルゴリズムは次のようになります:(擬似コード)

ゼロに設定されたカウンターを使用し、var intvar do {に数値を入力します。

  1. 右にシフト(整数を2で割る)-> splitedvar
  2. splitvar * 2!= intvarの場合、dividedvar = 0 /終了条件/
  3. else(intvar = splitvar and counter ++)} while splitvar!= 0

それを試してみてください

0x476f72616e Aug 25 2020 at 00:19

これは最も簡単な方法です。

if ((num & 0x1) == 0)
   // it is even
else
   // it is odd

ビット演算を使用しています。これでより高いパワーを見つけるには、再帰またはループを使用できます。

int powerOf2 (int a) {
   if ((a & 0x1) == 1)
      return 0;

   powerOf2 (a >> 1) + 1;
}

またはループ:

int powerOf2  (int a) {
    int pow = 1;
    while ((a & 1) != 1) {
        pow += 1;
        a >>= 1;
    }
    return pow
}

またはforループ:

int powerOf2  (int a) {
    int pow = 1;
    for (;(a & 1) != 1; a >>= 1) {
        pow *= 2;
    }
}

これは正の数に対して機能します。数が負の場合(そしてその機能が必要な場合)、それが。未満の場合は乗算aします。-10