所有,
我一直在网上练习编码问题.目前,我的工作问题说明问题,我们需要大端转换< - >小尾数.但考虑到给出的例子,我无法记下步骤:
123456789 converts to 365779719
Run Code Online (Sandbox Code Playgroud)
我正在考虑的逻辑是:
1>获取整数值(因为我在Windows x86上,输入是Little endian)
2>生成相同的十六进制表示.
3>反转表示并生成大端整数值
但我显然在这里遗漏了一些东西.
任何人都可以指导我.我在Java 1.5中编码
Wol*_*ied 29
由于编写软件的很大一部分是重用现有的解决方案,所以首先应该始终查看语言/库的文档.
reverse = Integer.reverseBytes(x);
Run Code Online (Sandbox Code Playgroud)
我不知道这个功能的效率如何,但是为了切换大量的数字,ByteBuffer
应该提供不错的性能.
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
...
int[] myArray = aFountOfIntegers();
ByteBuffer buffer = ByteBuffer.allocate(myArray.length*Integer.BYTES);
buffer.order(ByteOrder.LITTLE_ENDIAN);
for (int x:myArray) buffer.putInt(x);
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.rewind();
int i=0;
for (int x:myArray) myArray[i++] = buffer.getInt(x);
Run Code Online (Sandbox Code Playgroud)
正如eversor在注释中指出的那样,ByteBuffer.putInt()
是一种可选方法,可能并非在所有Java实现中都可用.
Stacker的答案非常简洁,但有可能对其进行改进.
reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
Run Code Online (Sandbox Code Playgroud)
我们可以通过调整位掩码来摆脱括号.E. g.,(a & 0xFF)<<8
相当于a<<8 & 0xFF00
.无论如何,最右边的括号不是必需的.
reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;
Run Code Online (Sandbox Code Playgroud)
由于左移位为零位,因此第一个掩码是冗余的.我们可以通过使用逻辑移位运算符来消除最右边的掩码,该运算符仅移位零位.
reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;
Run Code Online (Sandbox Code Playgroud)
这里的运算符优先级,移位运算符的粗略细节在Java语言规范中
sta*_*ker 25
看一下这个
int little2big(int i) {
return (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
}
Run Code Online (Sandbox Code Playgroud)
自1.5使用reverseBytes
方法以来,Java原始包装类支持字节反转.
Short.reverseBytes(short i)
Integer.reverseBytes(int i)
Long.reverseBytes(long i)
Run Code Online (Sandbox Code Playgroud)
对于那些在2018年寻找这个答案的人来说,这只是一个贡献.
归档时间: |
|
查看次数: |
52865 次 |
最近记录: |