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)
这是假的......
这应该工作:
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)
| 归档时间: |
|
| 查看次数: |
3683 次 |
| 最近记录: |