我的任务是在不运行的情况下弄清楚老师写的这个java程序在做什么。我已经附上了整个(短(程序,并用粗体显示了我不理解的表达式。这是第一个for循环的一部分,我也有点不清楚它的作用。
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);
分析代码正在做什么的一种有用方法是将其分解为尽可能小的步骤。
首先,有一些不需要的额外括号。所以,让我们通过改变这个来清理它:
(((0xFF << (i * 8)) & test))
与此完全相同:
(0xFF << (i * 8)) & test
现在,想象一下它被分解为不同的步骤:
int value = i * 8;
int mask = 0xFF << value;
int result = mask & test;
所以,你知道:
value
是8的倍数mask
是八个连续的1
位(因为0xFF在基数2中是11111111(,移位了8的倍数result
是该掩码对32位1111111111111111的应用(这是0xffffff的基二形式,这是test
的值(
希望,如果您已经完成了此赋值,那么您已经了解了按位&
运算符的用途:一个操作数中的每个1位都会保留另一个操作数中的相应位,而任一操作数的0位总是在结果中被清除。
这段代码中有很多内容都是不好的实践。没有挑战性,只是糟糕。在我看来,为了展示Java的数学和逐位运算符的知识,你得到了一项比应该做的要困难得多的任务。