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

Red*_*arp 1 java int bit-manipulation long-integer

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

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

long value = 785537;
Run Code Online (Sandbox Code Playgroud)

假设您想要将值的最高位设置为1,您可以执行以下操作:

value |= 0x8000000000000000l;
Run Code Online (Sandbox Code Playgroud)

很简单,对吧?但它根本不起作用.Java可以轻松改变另一位,这意味着

value |= 0x7000000000000000l;
Run Code Online (Sandbox Code Playgroud)

将工作.但如果它是最重要的一点,它将无法工作.

为什么?有没有办法实现我想要的?

提前感谢您的回答.

编辑:

以下是我编写的代码示例,以二进制形式显示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);
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

long val = -1;
printBits(val);
Run Code Online (Sandbox Code Playgroud)

它将按照预期打印"1111111111111111111111111111111111111111111111111111111111111110".如果我然后输入:

val |= Long.MIN_VALUE;
printBits(val);
Run Code Online (Sandbox Code Playgroud)

要么

val |= 0x8000000000000000l;
printBits(val);
Run Code Online (Sandbox Code Playgroud)

它的印刷"1111111111111111111111111111111111111111111111111111111111111110"也......

如果那么做以下测试:

(val & 8000000000000000l) != 0;
Run Code Online (Sandbox Code Playgroud)

这是假的......

Ada*_*man 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

运用

value |= 0x8000000000000000l;
Run Code Online (Sandbox Code Playgroud)

要么

value |= 1L << 63;
Run Code Online (Sandbox Code Playgroud)

代替

value |= Long.MIN_VALUE;
Run Code Online (Sandbox Code Playgroud)

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

两者都打印以下内容:

00000000000bfc81
80000000000bfc81
Run Code Online (Sandbox Code Playgroud)