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

时间:2014-12-15 11:27:34

标签: 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))是否定的。在文档中,运算符~给出了反转,但我不明白为什么这个数字在Python中是负数而不是在Java中?

1 个答案:

答案 0 :(得分:1)

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`