为了好玩,我一直在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;
这是假的......
答案 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;