首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java和python在逻辑运算符中给出了不同的结果

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

Stack Overflow用户
提问于 2014-12-15 11:27:34
回答 1查看 155关注 0票数 1

我正在努力获得Java和Python中的广播ip地址编码以供实践。下面是我在java中的代码,它提供了正确的输出:

代码语言:javascript
复制
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中,使用相同的逻辑,我得到了意想不到的结果:

代码语言:javascript
复制
def broadcastaddress(self):
    return IPv4Address(self.address.decimalip ^ (~(0xffffffff ^ (1 << 32 - self.mask) - 1)))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-15 11:50:01

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

代码语言:javascript
复制
>>> hex(~(0xffffffff ^ (1 << 32 - 24) - 1))
'-0xffffff01'
>>> ~(0xffffffff ^ (1 << 32 - 24) - 1)
-4294967041

但是,Java中的~将为您提供两个补码,而子网掩码上的操作需要一个补码,这可以通过在网络掩码上使用XOR来实现。因为这会撤销您已经应用过的另一个XOR操作,所以您不需要使用这里的补语at all

代码语言:javascript
复制
return IPv4Address(self.address.decimalip ^ ((1 << 32 - self.mask) - 1))

我怀疑您可以在这里使用IPv4Network.broadcast_address

代码语言:javascript
复制
network = IPv4Network('{}/{}'.format(self.address.decimalip, self.mask)
return network.broadcast_address`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27483011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档