为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2023-11-01 16:32:45
我一直在乱涂乱画这段小代码,它应该计算并打印出 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]如果您对此提出任何建议,我将非常感激。这可能只是一个幼稚的错误,所以请指出。
查看完整描述

4 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您的代码的问题是您正在查看的数组索引。当你输入数字 8 时,它的二进制表示是 1000。当你将它拆分成一个数组时,你会得到:

索引:0 1 2 3 值:1 0 0 0

因为您是从列表末尾开始,所以索引 0 将最后处理(并且与 2^0 相同)。

要解决此问题,您所需要做的就是反转您正在查看的元素的顺序,同时保持 for 循环的顺序相同。例如:而不是:

gigaBitArray[counter]

它应该是:

gigaBitArray[gigaBitArray.length -1 - counter]


查看完整回答
反对 回复 2023-11-01
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您首先测试低位。如果您希望首先列出高阶幂,则需要一个索引变量和一个幂变量。另外,无需检查“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);

    }

}


查看完整回答
反对 回复 2023-11-01
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

0除了上面的两个答案之外,您还可以通过将s 和s相乘来消除 if else 1:


int len = gigaBitArray.length;

for (int i = 0; i < gigaBitArray.length; i++) {

     powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));

}


查看完整回答
反对 回复 2023-11-01
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

这是一种方法。代码中的注释不明显。这里的想法是计算机内的所有信息都是binary。字符和数字是根据 打印出来的context。由于所有信息都是二进制的,因此可以将shifted left or right位字段向相同方向移动。这允许检测 a1或0bit,而无需求助于字符串操作的开销。


      for (int number : new int[] { 8, 10, 23, 11, 2, 4, 99

      }) {

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


         // starting bits to shift

         int shift = 0;

         // save number for printout

         int save = number;


         while (number > 0) {

            // ANDing the number with 1 will mask the

            // low order bit to a 1 or 0.

            // Then shift that bit "shift" number

            // of bits (first time thru is 0) and store

            // the power in p. Then increment # of bits

            // to shift.

            int p = (number & 1) << shift++;


            //add power to beginning of list.

            powers.add(0, p);


            // now shift the number right by 1 to position

            // for next bit.

            number >>= 1;


         }


         System.out.printf("%3d -> %s%n", save, powers);


      }

上面打印出以下内容:


  8 -> [8, 0, 0, 0]

 10 -> [8, 0, 2, 0]

 23 -> [16, 0, 4, 2, 1]

 11 -> [8, 0, 2, 1]

  2 -> [2, 0]

  4 -> [4, 0, 0]

 99 -> [64, 32, 0, 0, 0, 2, 1]


查看完整回答
反对 回复 2023-11-01
  • 4 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信