数が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 {に数値を入力します。
- 右にシフト(整数を2で割る)-> splitedvar
- splitvar * 2!= intvarの場合、dividedvar = 0 /終了条件/
- 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