2016-12-01 37 views
-1

由于某些原因,以下两个按位运算提供了不同的结果,但由于使用的掩码应该相同,所以它们应该提供相同的结果似乎很直观。我在这里错过了什么?为什么使用这两种口罩的结果会有所不同?按位运算符的输出之间的差别

public class BitShiftTest { 

    private long bitString = -8784238533840732024L ; 
    private final int MAX_BITS_POSITION = 63 ; 

    public static void main(String[] args) { 
     BitShiftTest bst = new BitShiftTest() ; 
     System.out.printf("Before applying mask: %s\n", Long.toBinaryString(bst.bitString)); 
     System.out.printf("Using Mask 1: %s\n", Long.toBinaryString(bst.clearBitMask(60))); 
     System.out.printf("Using Mask 2: %s\n", Long.toBinaryString(bst.clearBitMaskAlternative(60))); 
    } 

    public long clearBitMask(int position) { 
     return bitString & ~(1 << position) ; 
    } 

    public long clearBitMaskAlternative(int position) { 
     return bitString & (0x8000000000000000L >>> MAX_BITS_POSITION - position) ; 
    } 
} 

产生的结果是

Before applying mask: 1000011000011000000111011001100000101000001000000000000010001000 
Using Mask 1: 1000011000011000000111011001100000101000001000000000000010001000 
Using Mask 2: 0 
+3

不要修改'bitString'第一请拨打电话 – qxz

+0

对不起,我应该清除每个'clearBitMask ...'函数中的位串修改,但是我仍然得到相同的尴尬结果 – reayn3

+0

究竟是什么结果? – RealSkeptic

回答

0

你假设~(1<<position)0x8000000000000000L >>> MAX_BITS_POSITION - position是相等的,但事实并非如此。

基本上,在另一种情况下你错过了~--否则它看起来好像你只是试图提取一个位,而不是清除它。它应该是:

~(0x8000000000000000L >>> MAX_BITS_POSITION - position) 

而且,正如@RolandIllig 1 << position注意到INT算术实际上是完成的。你在输出中没有看到这一点,因为在你屏蔽的那一段时间内,第60或第28位都不会被设置。 1L << position解决了这个问题。

+0

好醇优先!所以实际上,如果掩码用于类似的数据类型,那么'〜(1 <<位置)'应该等于'(0x8000000000000000L >>>(MAX_BITS_POSITION - position))',对吗? – reayn3

+0

@你有优先权错误。 –

+0

谢谢@RolandIllig。它看起来好像在面具上使用'1L'来排序 – reayn3

0

1 << 63int类型,因此等于Integer.MIN_VALUE,因为1被移出数字。 (在其他语言中的结果将是不确定的,因为你用更多的比特比int转移了。

为了解决这个问题,使用1L << 63,这对long工作。

+0

谢谢罗兰。使用'bitString&〜(1L << position)'给出'bitString&〜(1 <<位置)'没有的预期结果。然而,'bitString&(0x8000000000000000L >>>(MAX_BITS_POSITION - position))'仍然返回一个不正确的值,尽管它看起来类似于'bitString&〜(1L <<位置)' – reayn3

+1

你得到['1 << 63 '错](http://ideone.com/jOU7Zz)。但是这不是计算! –

+0

@安迪谢谢,我纠正了它。 –