0

我已经在 Blue Pelican Java 中尝试了这个项目一个多小时,但我不太确定它为什么不起作用。基本上我要做的就是把一个普通的数字变成一个二进制数,假设 1 表示开关打开,0 表示它关闭,遍历二进制数中的每个数字并打印它是打开还是关闭。他们说明了他们希望我如何做到这一点:

“假设我们希望查看左起第三位。使用如下所示的掩码与原始数字按位与,以便仅查看第三位。1 0 1 1 0 0 0 1bin = 177dec 0 0 1 0 0 0 0 0bin = 32dec(这是掩码)

0 0 1 0 0 0 0 0bin = 32dec = (177 & 32)

请注意,这种对掩码值 32 进行按位与运算的方案(25,因为左起第三位位置的位置值为 25)在第三位位置产生的值与原始数字的第三位位置完全相同. 所有其他位的位置都保证为 0。因此,可以测试这个按位与运算的结果,看它的整个值是否为 0。如果大于 0,这意味着测试位置的位是 1。

在这一点上,我只是在 Switches.in 文件夹中测试第一个数字 22,而不是为代码导入整个文件夹。我的代码编译后,它开始打印我想要的内容,但突然中断并转到如下所示的错误消息:

Switch sw57is "off
Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
    at Tester.main(Tester.java:32)

这是我的代码:

import java.io.*;
import java.util.*;
import java.text.*;

public class Tester
{
    public static void main(String args[])
   {
    int j=22;
    String jj=Integer.toBinaryString(j);
    StringTokenizer sc=new StringTokenizer(jj,"");
    int l=(sc.countTokens());


    int a[]=new int[l];
    int xx=0;
    for(int x=l; x>-1; x--)
    {
        xx=xx++;
        double p=(Math.pow(2,xx));
        int pp=(int)p;
        int n=((j)&(pp));
        String nn=Integer.toBinaryString(n);
        StringTokenizer nnn=new StringTokenizer(nn);
        int po=(nnn.countTokens());
        int sum=0;

        System.out.println(nnn);

        for(int xxx=-1; xxx<po; xxx++)
        {
            sum=sum+(Integer.parseInt(nnn.nextToken()));


        if(sum>0)
        {
            System.out.println("Switch sw"+(x+56)+"is \"on");
        }
        else if(sum==0)
        {
            System.out.println("Switch sw"+(x+56)+"is \"off");
        }
        }
    }
}
}

我不确定代码有什么问题。任何建议将不胜感激。谢谢,很抱歉这篇冗长的帖子!

4

3 回答 3

0

问题是,从-1你开始将超过可用令牌的数量:

for (int xxx = -1; xxx < po; xxx++) {

在哪里

po = nnn.countTokens()

...因此,要更正,请使用:

for (int xxx = 0; xxx < po; xxx++) {

此外,由于 xxx 不在其他任何地方使用,您可以简单地使用:

while (nnn.hasMoreTokens()) {
   sum = ...
}
于 2012-08-14T00:50:54.083 回答
0

问题与sum=sum+(Integer.parseInt(nnn.nextToken()));. 请参见

  1. java StringTokenizer - nextToken 可以返回 null 吗?
  2. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html#nextToken

我认为以下代码解决了这个问题(我添加了一些 println 用于调试信息):

import java.io.*;
import java.util.*;
import java.text.*;

class Tester
{
    public static void main(String args[])
   {
    int j=22;
    String jj=Integer.toBinaryString(j);
    StringTokenizer sc=new StringTokenizer(jj,"");
    int l=(sc.countTokens());


    int a[]=new int[l];
    int xx=0;
    for(int x=l; x>-1; x--)
    {
        xx=xx++;
        double p=(Math.pow(2,xx));
        int pp=(int)p;
        int n=((j)&(pp));
        String nn=Integer.toBinaryString(n);
        StringTokenizer nnn=new StringTokenizer(nn);
        String nToken;
        int po=(nnn.countTokens());
        int sum=0;
        System.out.println("x = "+ x);
        System.out.println("po = "+ po);

        System.out.println(nnn);

        for(int xxx=0; xxx<po; xxx++)
        {
            System.out.println("xxx = "+ xxx);
            sum=sum+(Integer.parseInt(nnn.nextToken()));


        if(sum>0)
        {
            System.out.println("Switch sw"+(x+56)+"is \"on");
        }
        else if(sum==0)
        {
            System.out.println("Switch sw"+(x+56)+"is \"off");
        }
        }
    }
}
}
于 2012-08-14T00:51:26.407 回答
0

我没有看到您从中获取数据的指定文件。如果您希望您的程序正常工作,您可以考虑放置一个从中获取数据的文件。

于 2016-11-10T19:07:10.630 回答