检查数字是否可以被 2 的幂整除
Check if number is divisible by a power of two
找到除以 x
、一个 64 位整数或 return -1 的两个的最高幂。
零的情况没有定义,因为它是二的任意幂,所以你的方法可以 return 任何数字。
我尝试为此使用 BigInteger.getLowestSetBit()
,它 return 是正确的答案,但远非最佳答案。
示例:输入 -> 输出
- 3 -> -1
- 6 -> 1
- 4256 -> 5
在 Long
class 中,有一个方便的静态函数 numberOfTrailingZeros
,它几乎可以满足您的需求,除了它 returns 为零(而不是 - 1) 当输入不能被 2 整除时。您可以用不同的方式处理这种情况。比如扩展@0x476f72616e
的答案
if ((num & 0x1) == 0)
return Long.numberOfTrailingZeros(num);
else
return -1;
一个算法可能是:(伪代码)
使用设置为零的计数器,将数字放入 var intvar
做{
- 右移(整数除以二)->dividedvar
- if dividedvar*2 != intvar then dividedvar = 0 /退出条件/
- else (intvar = dividedvar and counter ++)
}
而 dividedvar !=0
试一试
找到除以 x
、一个 64 位整数或 return -1 的两个的最高幂。
零的情况没有定义,因为它是二的任意幂,所以你的方法可以 return 任何数字。
我尝试为此使用 BigInteger.getLowestSetBit()
,它 return 是正确的答案,但远非最佳答案。
示例:输入 -> 输出
- 3 -> -1
- 6 -> 1
- 4256 -> 5
在 Long
class 中,有一个方便的静态函数 numberOfTrailingZeros
,它几乎可以满足您的需求,除了它 returns 为零(而不是 - 1) 当输入不能被 2 整除时。您可以用不同的方式处理这种情况。比如扩展@0x476f72616e
if ((num & 0x1) == 0)
return Long.numberOfTrailingZeros(num);
else
return -1;
一个算法可能是:(伪代码)
使用设置为零的计数器,将数字放入 var intvar 做{
- 右移(整数除以二)->dividedvar
- if dividedvar*2 != intvar then dividedvar = 0 /退出条件/
- else (intvar = dividedvar and counter ++) } 而 dividedvar !=0
试一试