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

2024-10-01 11:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用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-number表示其掩码。我收到了预期的广播地址。 我在python中使用同样的逻辑得到了意外的结果:

^{pr2}$

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


Tags: 代码ip地址数字javapublicbitsbroadcast
1条回答
网友
1楼 · 发布于 2024-10-01 11:21:39

Python整数不是有界的,也不是有符号的,因此~会创建一个负数:

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

然而,Java中的~会给你一个two的补码,而子网掩码上的操作需要一个一个补码,这可以通过在网络掩码上使用XOR来实现。因为这会撤销已经应用的其他XOR操作,所以根本不需要在这里使用1的补码

^{pr2}$

我想你可以在这里使用^{}

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

相关问题 更多 >