2的幂?代码有啥问题
Posted
技术标签:
【中文标题】2的幂?代码有啥问题【英文标题】:Power of 2? whats wrong in code2的幂?代码有什么问题 【发布时间】:2018-12-17 02:35:42 【问题描述】:如果给定的 no 是 2 的幂,则将 1 添加到列表中,如果不是 2 的幂,则将 0 添加到列表中。 如果给定的输入列表是 [2,3,4]-->[1,0,1] 应该是结果,但我得到 [1,0,1,1] 为什么?
这是我的代码
public class HelloWorld
public static void main(String []args)
List<Integer> l=new ArrayList();
l.add(2);
l.add(3);
l.add(4);
List<Integer> l1=new ArrayList();
for(int i=0;i<l.size();i++)
if(l.get(i)==0)
l1.add(0);
int n=l.get(i);
while(n!=1)
if(n%2!=0)
l1.add(0);
n=n/2;
l1.add(1);
System.out.println(l1);
【问题讨论】:
因为 4 是 2 乘以 2。所以 4%2=0,然后 4/2 = 2,并且 2%2=0 欢迎来到 Stack Overflow!最好的办法是使用 IDE 中内置的调试器逐步执行代码,逐步了解您编写的逻辑是如何工作的。学习使用调试器是初级程序员的一项重要技能,不用担心,这并不复杂。 (不是我的反对票) 请看How to debug small programs 在将0
添加到列表后尝试中断循环。
如果有帮助,n > 0 && (n&-n)==n
将识别 2 的幂。
【参考方案1】:
您的代码在第 3 位出现故障,看看会发生什么:
// first iteration second iteration
while(n!=1) // 3 is not 1 n is 1, so stop
if(n%2!=0) // 3%2 is 1, so it is not 0
l1.add(0); // you add 0 to the list
n=n/2; // 3/2 is 1
l1.add(1); // after the loop, add 1
如果您已经为某个数字添加了 0,则您不想再添加 1。您应该确保只为旧列表中的每个号码在新列表中添加一个号码。
首先,您可能会注意到 Javac 抱怨您正在使用未经检查或不安全的操作。那是因为您只在一侧使用 菱形运算符。也将它们添加到右侧,以确保编译器知道哪些对象可以进入您的列表。
while(n!=1) // As long as n is not 1
if (n%2!=0) // if n%2 is not 0 (it is 1) and we can
l1.add(0); // set 0
if (n==2) // if n is 2, it is a power of 2 and we can
l1.add(1); // set 1
n=n/2; // if n is neither 1, nor 2, we need to keep dividing
如果 n 为 2,您应该只在列表中添加 1,因为这样您就确定您正在处理的数字是 2 的幂。
希望这很清楚,因为下一步将修复列表元素为 0 时的代码,因为此时,这将导致无限循环。祝你好运!
【讨论】:
以上是关于2的幂?代码有啥问题的主要内容,如果未能解决你的问题,请参考以下文章
在 x86 汇编代码(GAS 语法)中有效乘以 2 的幂而不影响标志