私は何このJavaのprint文「(((0xFFの<<(私は8))&テスト)*)))「と描写するためにしようとしています

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の倍数であります
  • mask8連続している1(0xFFでは、ベース2に11111111であるため)ビット、8の倍数である数だけシフト
  • result(の値は0xFFFFFFFFのベース2つのフォームである32ビット11111111111111111111111111111111へのマスクの適用ですtest

あなたはこの割り当てを与えてきた場合はうまくいけば、あなたはすでにビット単位の目的を理解する&オペレータを:常に結果にクリアされるオペランドのいずれかの0ビット、一方のオペランドの各1ビットは、他のオペランドに対応するビットを保持します。

そこ貧しい実践している、このコードでは多くのことを。挑戦しない、ちょうど悪いです。あなたは、Javaの数学とビット演算子の知識を実証する目的のために、私の意見では、はるかに困難それがあるべきよりも、ある割り当てを与えてきました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=318987&siteId=1