左移零的目的是什么?

0-0*_*0-0 27 java

在阅读ASM 4.1源代码后,我发现了以下实例:

int ASM4 = 4 << 16 | 0 << 8 | 0;
int ASM5 = 5 << 16 | 0 << 8 | 0;
Run Code Online (Sandbox Code Playgroud)

这些左移0到8是否对表达做了什么,或者'或'为0做了什么?

它不等于只有:

int ASM4 = 4 << 16;
int ASM5 = 5 << 16;
Run Code Online (Sandbox Code Playgroud)

man*_*uti 38

实际上它们是等价的,但一种可能的解释是,他们希望将包括主要次要数字的版本号映射到其代码中的唯一ID.所以在下面:

int ASM4 = 4 << 16 | 0 << 8 | 0; // this looks like 4.0.0
int ASM5 = 5 << 16 | 0 << 8 | 0; // this looks list 5.0.0
Run Code Online (Sandbox Code Playgroud)

45代表的版本4,并5分别与zero0 << 8可能是次要的数字,最后zero是另一个次要号码,如4.0.05.0.0.但无论如何,那是我的猜测.你真的要问作者.

  • +1:程序不仅写入计算机进行编译,而且写入下一个开发人员.实际上,我发现越来越多的程序是为下一个开发人员编写的,只需要一点点语法就可以编译.大型课程难以阅读! (17认同)
  • int ASM4 = 0x400; 会更简洁地完成同样的目的.. (8认同)
  • @pericynthion:也许是同一个目的,但为了得到相同的效果,你必须编写`int ASM4 = 0x40000`,恕我直言,这使得它不太明显,这对应于版本4.0.0.(也许他们想要允许版本4.0.16 ...) (4认同)
  • @NateEldredge确实.我喜欢这5个人+ 1ed我的评论,所有人显然都记不起有多少比特在我能做的比赛中! (4认同)
  • @NateEldredge:这就是为什么我们得到'0x4'00'00` (2认同)

Adr*_*ard 17

在上下文中:

// ASM API versions

int ASM4 = 4 << 16 | 0 << 8 | 0;
int ASM5 = 5 << 16 | 0 << 8 | 0;
Run Code Online (Sandbox Code Playgroud)

是的,这相当于

int ASM4 = 4 << 16;
int ASM5 = 5 << 16;
Run Code Online (Sandbox Code Playgroud)

这只是为了清楚地说明我们将第3个字节设置为4,并将两个较低的字节设置为0.或者,这是一个应该读取为4.0.0的版本号.

  • 有趣的是它有时如何在SO上工作.你说的几乎与接受的答案相同,甚至早一点发布*. (2认同)

fge*_*fge 10

它确实没有任何意义,但它的整齐和视觉对齐,以便ASM开发人员了解操作码版本(如果我没有弄错,这就是OpCodes你在这里看到的界面).

与你使用1 << 0vs 1 << 1等相同的方式

  • @christopher即使他们这样做了,好吧,正如俗话所说,代码谈判;) (4认同)
  • 我想知道他们是否听说过评论?无论哪种方式,这似乎是最可能的解释. (2认同)