は私の方法です: Fl_IN = 1114599018であり、k = 0最後の値が間違っているのはなぜですか?ここ
public void int FL(int FL_IN, int k) {
int d0, d1;
d0 = FL_IN >> 16;
d1 = FL_IN & 0xffff;
if (k % 2 == 0) {
d1 = d1^(d0 & EK[k/2]);
d0 = d0^(d1 | EK[(k/2 + 6) % 8 + 8]);
} else {
d1 = d1^(d0 & EK[((k - 1)/2 + 2) % 8 + 8]);
d0 = d0^(d1 | EK[((k - 1)/2 + 4) % 8]);
}
System.out.println(Integer.toBinaryString(d0));
System.out.println(Integer.toBinaryString(d1));
System.out.println(Integer.toBinaryString(d0 << 16));
System.out.println(Integer.toBinaryString((d0 << 16) | d1));
System.out.println((d0 << 16) | d1);
}
そして、ここでは、出力されます。
1110110010101000
10111001000110
11101100101010000000000000000000
11101100101010000010111001000110
-324522426
それは11101100101010000010111001000110は= -324522426それを言っている理由を私は理解していません3970444870
EDIT次のようになります。長いintの代わりに使用して問題を解決し
符号付き整数に収まるか? http://www.binaryconvert.com/result_signed_int.html?hexadecimal=ECA82E46を参照してください。 –
'int'は32ビット**の署名**番号です。値 '3970444870'は大きすぎて32ビットの符号付き' int'に収まらない。バイナリ値「11101100101010000010111001000110」は、「2の補数」(https://en.wikipedia.org/wiki/Two%27s_complement)で「-324522426」に等しい。 – Jesper
これは 'd0'が* signed *整数であるためです。非常に詳細な記事については、[2の補数](https://en.wikipedia.org/wiki/Two%27s_complement)を参照してください。 3970444870を印刷したい場合は、より大きな(64ビット)整数型を使用する必要があります。 「長い」。 –