java和python在逻辑运算符中给出不同的结果

标签 java python logical-operators

我正在尝试使用 Java 和 Python 进行广播 IP 地址编码以进行练习。这是我的 java 代码,它给了我正确的输出:

public IPv4Address getBroadcastAddress() throws IllegalArgumentException {
    long bits = 0;
    bits = this.address.decimalIP() ^ (~(0xffffffff ^ (1L << 32 - getMaskLength()) - 1));
    IPv4Address broadcast = new IPv4Address(bits);

    return broadcast; 
}

这里decimalIP是代表 IP 地址的数字,getMaskLength - 代表其掩码的数字。在这里我得到了预期的广播地址。 通过在 python 中使用相同的逻辑,我得到了意想不到的结果:

def broadcastaddress(self):
    return IPv4Address(self.address.decimalip ^ (~(0xffffffff ^ (1 << 32 - self.mask) - 1)))

这里所有组件代表与 java 中相同的条目。调试后我得到了那个号码(~(0xffffffff ^ (1 << 32 - self.mask) - 1))是负数。在文档运算符(operator)~给出了位反转,但我不明白为什么这个数字在 Python 中是负数,而在 Java 中不是?

最佳答案

Python 整数没有界限且没有符号,因此 ~ 创建一个负数:

>>> hex(~(0xffffffff ^ (1 << 32 - 24) - 1))
'-0xffffff01'
>>> ~(0xffffffff ^ (1 << 32 - 24) - 1)
-4294967041

但是,Java 中的 ~ 会给出二进制补码,而对子网掩码的操作则需要一个补码,这可以通过在网络掩码上使用XOR来实现。由于这会撤消您已经应用的其他XOR操作,因此您根本不需要在这里使用1的补码 :

return IPv4Address(self.address.decimalip ^ ((1 << 32 - self.mask) - 1))

我怀疑你可以使用IPv4Network.broadcast_address这里:

network = IPv4Network('{}/{}'.format(self.address.decimalip, self.mask)
return network.broadcast_address`

关于java和python在逻辑运算符中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483011/

相关文章:

java - 如何在将光标放在 HTML 元素上时获取其属性?

c - 变量中的逻辑运算符和初始化

C 预处理器测试多个宏的定义

matlab - 如何将 && 操作数求解为逻辑标量

java - 另一个应用程序的 Windows 状态。使用 Java (Ubuntu) 处理

java - ExecutorService InvokeAll 进度条

java - 读取正整数大小并根据输入绘制数字三角形

python - "zsh: illegal hardware instruction python"在 macbook pro M1 上安装 Tensorflow 时

python - PyPy 的垃圾收集器需要阻止世界吗?

python - PyOpenCL 在内核代码中索引 3D 数组