griffin3419:
私の割り当ては、それを実行せず、先生によって書かれたこのJavaプログラムが何をしているかを把握することです。私は、全体の(短い)プログラムを添付して、私は理解していない表現を太字にしています。それは離れて、私もそれが何をするなど少し不明確だこれは、ループの最初のです。
import java.util.*;
int intSize = Integer.SIZE / 8; char storage[] = new char[intSize]; int test = 0xffffffff,
test2 = 0;
System.out.println(String.format("0x%08x",0xFF << (3 * 8) & test));
storage[0] = (char) ((0xF << 4));
for (int i = intSize - 1 ; i > -1 ; i--)
// storage[i] = (char) ((0xFF << (i * 8)) & test);
System.out.println(String.format("0x%08x",**(((0xFF << (i * 8)) & test))));**
for (int i = 0, j = intSize-1; i < intSize ; i++, j--)
test2 &= (((int) storage[i]) << (j * 8));
System.out.println(“The Magic Word of the Day is the English word for: ”+test2);
VGR:
、コードが何をしているかを分析するための有用な方法は、可能な最小のステップにそれを打破することです。
まず、必要のない余分な括弧があります。それでは、これを変更することで、クリーンアップそれを、してみましょう:
(((0xFF << (i * 8)) & test))
これに、これはまったく同じものです。
(0xFF << (i * 8)) & test
さて、それは別々のステップに分け想像:
int value = i * 8;
int mask = 0xFF << value;
int result = mask & test;
だから、あなたはそれを知っています:
value
8の倍数でありますmask
8連続している1
(0xFFでは、ベース2に11111111であるため)ビット、8の倍数である数だけシフトresult
(の値は0xFFFFFFFFのベース2つのフォームである32ビット11111111111111111111111111111111へのマスクの適用ですtest
)
あなたはこの割り当てを与えてきた場合はうまくいけば、あなたはすでにビット単位の目的を理解する&
オペレータを:常に結果にクリアされるオペランドのいずれかの0ビット、一方のオペランドの各1ビットは、他のオペランドに対応するビットを保持します。
そこ貧しい実践している、このコードでは多くのことを。挑戦しない、ちょうど悪いです。あなたは、Javaの数学とビット演算子の知識を実証する目的のために、私の意見では、はるかに困難それがあるべきよりも、ある割り当てを与えてきました。