大家好,
我一直在网上练习编码问题。目前我正在解决一个问题陈述Problems,其中我们需要将大端序与小端序进行转换。但是,考虑到给定的示例,我无法记录下具体步骤:
123456789 converts to 365779719
我考虑的逻辑是:
1 > 获取整数值(由于我使用的是Windows x86,输入为小端)
2 > 生成相同的十六进制表示。
3 > 反转表示并生成大端整数值
但我显然漏掉了什么。
请问有谁能指导我吗?我正在使用Java 1.5编码。
大家好,
我一直在网上练习编码问题。目前我正在解决一个问题陈述Problems,其中我们需要将大端序与小端序进行转换。但是,考虑到给定的示例,我无法记录下具体步骤:
123456789 converts to 365779719
我考虑的逻辑是:
1 > 获取整数值(由于我使用的是Windows x86,输入为小端)
2 > 生成相同的十六进制表示。
3 > 反转表示并生成大端整数值
但我显然漏掉了什么。
请问有谁能指导我吗?我正在使用Java 1.5编码。
由于编写软件的重要部分是重复使用现有的解决方案,因此首先应该查阅您所使用语言/库的文档。
reverse = Integer.reverseBytes(x);
我不知道这个函数的效率如何,但是对于切换大量数字来说,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);
正如评论中eversor所指出的那样,ByteBuffer.putInt()
是一个可选方法,并且可能在所有Java实现中都不可用。
Stacker的回答很不错,但是还有改进的空间。
reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
通过调整位掩码,我们可以摆脱括号。例如,(a & 0xFF)<<8
等同于 a<<8 & 0xFF00
。右边的括号本来就不必要。
reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;
由于左移操作会将零位移入,所以第一个掩码是多余的。我们可以使用逻辑移位运算符来除去最右边的掩码,它只移入零位。
reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;
看这个
int little2big(int i) {
return (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
}
return ((i << 24) + ((i << 8) & 0x00FF0000) + ((i >> 8) & 0x0000FF00) + (i >>> 24))
- Lawrence Dol0x0000001B
。要将该数字转化为0x1B000000
... 以你所举的例子,123456789的十六进制表示是0x075BCD15
,需要转换为0x15CD5B07
或十进制形式的365779719。i&0xff
从i
中提取出最低位字节,然后<< 24
将其向上移动24位,从位置1-8移到25-32。每个表达式都是按照这种方式处理的。0x000000000000001B
- Guido Tarsia自JDK 1.5版起,Java原始类型包装类支持使用reverseBytes
方法进行字节反转。
Short.reverseBytes(short i)
Integer.reverseBytes(int i)
Long.reverseBytes(long i)
这只是给那些在2018年寻找答案的人的一点贡献。
int littleToBig(int i)
{
int b0,b1,b2,b3;
b0 = (i&0x000000ff)>>0;
b1 = (i&0x0000ff00)>>8;
b2 = (i&0x00ff0000)>>16;
b3 = (i&0xff000000)>>24;
return ((b0<<24)|(b1<<16)|(b2<<8)|(b3<<0));
}
b3 = (i & 0xff000000) >>> 24
来进行修正。否则,如果 i
的最高位为1,则会将其复制到返回结果的最高24位中。 - Rinke只需在Java中使用Integer包装类下的静态函数(reverseBytes(int i))
Integer i=Integer.reverseBytes(123456789);
System.out.println(i);
输出:
365779719
下面的方法可以将一个字节值中的位序反转:
public static byte reverseBitOrder(byte b) {
int converted = 0x00;
converted ^= (b & 0b1000_0000) >> 7;
converted ^= (b & 0b0100_0000) >> 5;
converted ^= (b & 0b0010_0000) >> 3;
converted ^= (b & 0b0001_0000) >> 1;
converted ^= (b & 0b0000_1000) << 1;
converted ^= (b & 0b0000_0100) << 3;
converted ^= (b & 0b0000_0010) << 5;
converted ^= (b & 0b0000_0001) << 7;
return (byte) (converted & 0xFF);
}
reverseBytes
的定义非常相似:return ((i >>> 24) ) | ((i >> 8) & 0xFF00) | ((i << 8) & 0xFF0000) | ((i << 24));
- BullyWiiPlaza