如何修复计算二进制数幂但经常失败的方法?

我一直在乱涂乱画这段小代码,它应该计算并打印出 2 的哪些幂可以总结为给定的数字。它适用于小的奇数,但当我希望它计算偶数或更大的数时,它会丢失。


我什至不知道我可以尝试什么,代码看起来不错,但我可能一直没有注意到。


System.out.println("Give a number");

    int gigaInt = si.nextInt();

    String  gigaBit = Integer.toBinaryString(gigaInt);

    String[] gigaBitArray = gigaBit.split("");


 System.out.println("Binary: " + gigaBit);


 List<Integer> powers = new ArrayList<Integer>();



 for(int counter = gigaBitArray.length-1; counter >= 0; counter--){

        if (gigaBitArray[counter].equals("1"))

            powers.add((int)Math.pow(2,counter));

        else if(gigaBitArray[counter].equals("0")){

            powers.add(0);


        }




    }



    System.out.println("Powers: " + powers);

所以,显然,程序应该计算幂,而且确实如此!在某些情况下...这里,当给出 9


给出一个数字 9 二进制:1001 幂:[8, 0, 0, 1]


但是当我希望它计算偶数时,它总是显示“1”作为唯一的组成部分,如下所示:


给出一个数字 8 二进制:1000 幂:[0, 0, 0, 1]


每当被要求处理一个大数字时,它就会变得完全疯狂:


给出一个数字 542 二进制:1000011110 幂:[0, 256, 128, 64, 32, 0, 0, 0, 0, 1]


如果您对此提出任何建议,我将非常感激。这可能只是一个幼稚的错误,所以请指出。


郎朗坤
浏览 146回答 4
4回答

慕尼黑5688855

您的代码的问题是您正在查看的数组索引。当你输入数字 8 时,它的二进制表示是 1000。当你将它拆分成一个数组时,你会得到:索引:0 1 2 3 值:1 0 0 0因为您是从列表末尾开始,所以索引 0 将最后处理(并且与 2^0 相同)。要解决此问题,您所需要做的就是反转您正在查看的元素的顺序,同时保持 for 循环的顺序相同。例如:而不是:gigaBitArray[counter]它应该是:gigaBitArray[gigaBitArray.length&nbsp;-1&nbsp;-&nbsp;counter]

蛊毒传说

您首先测试低位。如果您希望首先列出高阶幂,则需要一个索引变量和一个幂变量。另外,无需检查“0”。如果它不是“1”,那么它一定是“0”。int iIndex;int iLength = gigaBitArray.length; int iPower = iLength - 1;for ( iIndex = 0; iIndex < iLength; ++iIndex, --iPower ){    if ( gigaBitArray[iIndex].equals("1") )    {        powers.add((int)Math.pow(2, iPower));    }    else    {        powers.add(0);    }}

斯蒂芬大帝

0除了上面的两个答案之外,您还可以通过将s 和s相乘来消除 if else 1:int len = gigaBitArray.length;for (int i = 0; i < gigaBitArray.length; i++) {&nbsp; &nbsp; &nbsp;powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));}

慕妹3242003

这是一种方法。代码中的注释不明显。这里的想法是计算机内的所有信息都是binary。字符和数字是根据 打印出来的context。由于所有信息都是二进制的,因此可以将shifted left or right位字段向相同方向移动。这允许检测 a1或0bit,而无需求助于字符串操作的开销。&nbsp; &nbsp; &nbsp; for (int number : new int[] { 8, 10, 23, 11, 2, 4, 99&nbsp; &nbsp; &nbsp; }) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;List<Integer> powers = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// starting bits to shift&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int shift = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// save number for printout&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int save = number;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (number > 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ANDing the number with 1 will mask the&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // low order bit to a 1 or 0.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Then shift that bit "shift" number&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // of bits (first time thru is 0) and store&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // the power in p. Then increment # of bits&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // to shift.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int p = (number & 1) << shift++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //add power to beginning of list.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; powers.add(0, p);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // now shift the number right by 1 to position&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for next bit.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number >>= 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.printf("%3d -> %s%n", save, powers);&nbsp; &nbsp; &nbsp; }上面打印出以下内容:&nbsp; 8 -> [8, 0, 0, 0]&nbsp;10 -> [8, 0, 2, 0]&nbsp;23 -> [16, 0, 4, 2, 1]&nbsp;11 -> [8, 0, 2, 1]&nbsp; 2 -> [2, 0]&nbsp; 4 -> [4, 0, 0]&nbsp;99 -> [64, 32, 0, 0, 0, 2, 1]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java