Java int和long:如何更改最重要的位?

时间:2011-12-11 18:51:56

标签: java int bit-manipulation long-integer

为了好玩,我一直在java中实现DES算法。 (嗯,实际上并不是那么有趣)。 在算法中,你处理64个数据块,我想:嘿,它是完美的,让我们使用“long”来存储我的二进制数据。

然后我遇到了一个让我生气的严重问题:让我们说你建立一个很长的,就像这样:

long value = 785537;

假设您要将值的最高位设置为1,您可以这样做:

value |= 0x8000000000000000l;

非常简单,对吧? 但它根本不起作用。 Java可以轻松更改另一位,这意味着

value |= 0x7000000000000000l;

会奏效。但如果它是最重要的一点,它将无法工作。

为什么?有没有办法达到我想要的目的?

提前感谢您的回答。

编辑:

以下是我编写的代码示例,以二进制形式显示long:

public static void printBits(long input){
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < 64; i++){
        if((input & (0x1l << i)) != 0){
            builder.append('1');
        } else {
            builder.append('0');
        }
    }

    System.out.println(builder);
}

如果我这样做:

long val = -1;
printBits(val);

按照预期打印“1111111111111111111111111111111111111111111111111111111111111110”。 如果我输入:

val |= Long.MIN_VALUE;
printBits(val);

或者

val |= 0x8000000000000000l;
printBits(val);

它还打印“1111111111111111111111111111111111111111111111111111111111111110”......

如果那样做以下测试:

(val & 8000000000000000l) != 0;

这是假的......

2 个答案:

答案 0 :(得分:6)

这应该有效:

public class LongMsb {
  public static void main(String[] args) {
    long value = 785537;
    System.out.printf("%016x\n", value);
    value |= Long.MIN_VALUE;
    System.out.printf("%016x\n", value);
  }
}

使用

value |= 0x8000000000000000l;

value |= 1L << 63;

而不是

value |= Long.MIN_VALUE;

也有效,可能更具可读性。

两者都打印以下内容:

00000000000bfc81
80000000000bfc81

答案 1 :(得分:0)

最高位表示的数字将是long的最小值,因此它将是:

long mask = Long.MIN_VALUE;

然后使用该掩码反转最高位,可以使用按位xor:

long value  = 785537;
value ^= mask;

编辑:我误读了,我以为你想反转最重要的一点;只需设置它,您的方法是正确的:

value |= mask;