我试图描述这个java打印语句"((0xFF <<(i * 8)))和test)))"是什么意思



我的任务是在不运行的情况下弄清楚老师写的这个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的数学和逐位运算符的知识,你得到了一项比应该做的要困难得多的任务。

相关内容

最新更新