0

これは私がC++で書いた関数であり(動作します)、現在Javaに変換しようとしています:

static String parseAInstruction(String line) {
    int n = getValue(line);
    if (n>=0) {
        String inst = "0";
        for (int i=14; i>=0; --i) {
            if (Math.pow(2, i) & n)
                inst += "1";
            else
                inst += "0";
        }
        return inst;
    } else {
        return "error";
    }
}

これは C++ では問題なくコンパイルされますが、Java でコンパイルしようとすると、次のエラーが発生します。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Type mismatch: cannot convert from int to boolean

    at parser.Parser.parseAInstruction(Parser.java:38)
    at parser.Parser.main(Parser.java:50)

Javaでビット単位のANDを調べると、同じはずのようです。ブール値とはまったく関係ありません。誰でも問題を教えてもらえますか?

4

5 に答える 5

4

ifJava では、節でブール値のみを使用できます。そのため、2 つの数値のビットごとの AND の結果は、ifステートメントでは有効ではありません。

代わりにこれを試してください: if ((Math.pow(2, i) & n) != 0) {.

[編集]ただし、コメント投稿者 @jlordo が指摘するように、次に double と integer の間でビットごとの AND を実行する問題を解決する必要があります。

于 2013-02-05T00:23:15.113 に答える
3

問題は、 の条件式で整数だけを使用できないことですif。次のようなものが必要です:

        if (((int)Math.pow(2, i) & n) != 0)
于 2013-02-05T00:25:56.277 に答える
2

あなたの問題はここにあります:

if (Math.pow(2, i) & n)

booleanJava では、条件として値が必要です。あなたはおそらく欲しい:

if (((int)(Math.pow(2, i)) & n) != 0)

はa を返し、演算子は 2 つのオペランドに対してのみ定義されているため、へのキャストintが必要です。Math.pow()double&int

于 2013-02-05T00:24:01.820 に答える
1

Math.powJava では、対数とべき乗を使用して計算されます (コンパイラが の呼び出しを最適化することが多い C++ とは異なりますpow)。どちらも非常に低速で近似的な浮動小数点演算です。

ここで使用しても意味がありません-ビットで作業しているので、ビットで作業します:

(n & (1 << i)) != 0あなたが探しているものです。

于 2013-02-05T08:39:02.347 に答える
1

Java で 2 つの int を使用してビットごとの AND を実行しようとしていますが、コンパイラはそれらを bool として使用しようとします。

いいえ、そうではありません。ビットごとの AND の結果の型はintです。Java では、ifステートメント内の式がブール型である必要がありますが、あなたのものはそうではありません。式をブール値に変換する必要があります。

于 2013-02-05T00:24:17.857 に答える