Java 检查数字是否可以被二的幂整除

Java 检查数字是否可以被二的幂整除,java,algorithm,bit-manipulation,Java,Algorithm,Bit Manipulation,查找除以x的两个整数的最大幂,即64位整数,或返回-1。 零的情况没有定义,因为它是二的任意幂,所以您的方法可以返回任意数字 我尝试使用了biginger.getLowestSetBit()对于这个问题,它返回了正确的答案,但远远不是最优的 示例:输入->输出 3->-1 6->1 4256->5 在Long类中,有一个方便的静态函数,它几乎可以实现您想要的功能,只是当输入不能被2整除时,它返回零(而不是-1)。你可以用不同的方法处理这个案子。例如,扩展@0x476f72616e的答案 if

查找除以
x
的两个整数的最大幂,即64位整数,或返回-1。
零的情况没有定义,因为它是二的任意幂,所以您的方法可以返回任意数字

我尝试使用了
biginger.getLowestSetBit()
对于这个问题,它返回了正确的答案,但远远不是最优的

示例:输入->输出

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

Long
类中,有一个方便的静态函数,它几乎可以实现您想要的功能,只是当输入不能被2整除时,它返回零(而不是-1)。你可以用不同的方法处理这个案子。例如,扩展@0x476f72616e的答案

if ((num & 0x1) == 0)
    return Long.numberOfTrailingZeros(num);
else
    return -1;
一种算法可以是:(伪码)

使用设置为零的计数器,将数字放入var intvar 做{

  • 右移(整数除以2)->dividedvar
  • 如果dividedvar*2!=intvar,则dividedvar=0/退出条件/
  • else(intvar=dividedvar和counter++) } 当我们分开的时候=0

  • 尝试它

    与问题相同的输出。好的<代码>-3->-1良好。--<代码>-4->2良好。--<代码>0->64错误@安德烈亚斯,这在问题中没有具体说明,无论如何,对于零没有正确的答案,因为它可以被二的任何幂整除,所以没有最高的答案,答案应该是0还是-1是有争议的,但64肯定不是正确的答案。但我主要是把评论放在这里,让人们意识到这个问题,即负数是可以处理的(但应该是吗?),而零不是(应该是怎样处理的?),他们应该自己决定如何处理。哇,java绝对是为懒惰的人准备的:)。当然,我从你的答案中学到了。@Andreas 0当然也不是正确的答案,它不比64好,1肯定不是二的最大幂,0可以被二除。它也不可能是-1,这将宣布零为奇数。答案应该是没有什么,所有的选择都是错误的。