gpt4 book ai didi

Java int 和 long : how to change the most significant bit?

转载 作者:行者123 更新时间:2023-11-29 06:43:46 24 4
gpt4 key购买 nike

为了好玩,我一直在用 java 实现 DES 算法。 (好吧,实际上并没有那么有趣)。在该算法中,您处理 64 位数据 block ,我想:嘿,这太完美了,让我们使用“long”来存储我的二进制数据。

然后我遇到了一个严重的麻烦,这让我很生气:假设你 build 了一个长的,像这样:

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);

它将按预期打印“111111111111111111111111111111111111111111111111111111111111110”。如果我然后输入:

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

或者

val |= 0x8000000000000000l;
printBits(val);

它还打印“11111111111111111111111111111111111111111111111111111111111110”...

如果那么做下面的测试:

(val & 8000000000000000l) != 0;

这是假的...

最佳答案

这应该有效:

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

关于Java int 和 long : how to change the most significant bit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com