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 &gt; 0 &amp;&amp; (n&amp;-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 的幂而不影响标志

PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

java刷题--231 2的幂

java刷题--231 2的幂

java刷题--231 2的幂

一致性:将整数除以 2 的幂与 10 的幂?