0

Blue Pelican Java でこのプロジェクトを 1 時間以上試してみましたが、うまくいかない理由がよくわかりません。基本的に私がしなければならないことは、通常の数を 2 進数に変換することです。1 はスイッチが開いていることを意味し、0 はスイッチが閉じていることを意味し、2 進数の各桁を調べて、開いているか閉じているかを出力します。彼らは私にこれをしてほしいと述べました:

「左から 3 番目のビットを調べたいとします。3 番目のビットのみを調べるには、以下に示すようにマスクを使用して、元の数値とビットごとに AND します。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 のマスク値 (左から 3 番目のビット位置の位置値は 25 であるため 25) をビットごとに AND 演算するこのスキームは、元の数値の 3 番目のビット位置と正確に等しい 3 番目のビット位置の値を生成することに注意してください。 . 他のすべてのビット位置は 0 であることが保証されています。したがって、このビットごとの AND 演算の結果をテストして、その値全体が 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 に答える