我没有学习 IT,直到最近才遇到移位和二进制补码的应用程序。那么,您能否在解释中使用简单的英语,并假设我对 IP 地址、位操作和 Java 数据类型几乎一无所知?
今天,我发现了以下一段代码(缩写):
long m = (-1) << (byte) 16;
现在,这是用于 IP 子网掩码。我知道我需要从 4 个 8 位块(即 4 个字节)开始,并且所有位都必须“打开”:11111111 11111111 1111111 1111111
接下来,从右侧移入零,在这种情况下是 16 位的值;所以我们得到11111111 11111111 00000000 0000000
了,面具。
但我确实有几个问题:
16
必须是类型byte
才能工作吗?- 结果是类型
long
。当上面的表达式运行时,-1
被转换为 - 有效 - 4x8bit 块。在应用二进制补码时,Java 如何知道它需要 32 个位置/位(IP 地址的长度),而不是 16 或 8 个?(我猜这与long
数据类型有关?) - 为什么二进制补码应用于
-1
开头?-0b1
(如果你问它二进制是什么,谷歌会给你-1
。我首先认为这可能与溢出有关,但事实并非如此,是不是......?) - 真的,编译器在运行代码时会将其转换为什么数据类型,以使其正常工作?
更新:由16
方法在运行时产生;我只是在这里放一个常数作为例子。事后看来可能是个坏主意...