Java 获得指数为1';字节数组中的s
给定字节数组:Java 获得指数为1';字节数组中的s,java,Java,给定字节数组: {255, 3, 5} 这相当于: {11111111, 00000011, 00000101} 我希望得到以下结果: {23,22,21,20,19,18,17,16, 9,8, 2,0} 这是输入数组中1的索引数组 在Java中,最快的方法是什么 更新: 我选择了最快的解决方案,@aioobe's。下面是一个相当大的数据测试的测试结果: @艾奥贝的方式: 35s 289ms 35s 991ms 36s 174ms @马蒂恩的方式: 39s 274ms 39s 879m
{255, 3, 5}
这相当于:
{11111111, 00000011, 00000101}
我希望得到以下结果:
{23,22,21,20,19,18,17,16, 9,8, 2,0}
这是输入数组中1的索引数组
在Java中,最快的方法是什么
更新:
我选择了最快的解决方案,@aioobe's。下面是一个相当大的数据测试的测试结果:
@艾奥贝的方式:
35s 289ms
35s 991ms
36s 174ms
@马蒂恩的方式:
39s 274ms
39s 879ms
38s 684ms
谢谢大家!我感谢你的帮助
在Java中,最快的方法是什么
大概是通过类型为int[][]
的256项查找表,其中lut[yourByte]
等于yourByte
中索引的数组
然后你就这样做
for (int i = 0; i < bytes.length; i++)
for (int indexes : lut[bytes[i]])
appendToResult(indexes + (bytes.length - 1 - i) * 8);
for(int i=0;i
在Java中,最快的方法是什么
大概是通过类型为int[][]
的256项查找表,其中lut[yourByte]
等于yourByte
中索引的数组
然后你就这样做
for (int i = 0; i < bytes.length; i++)
for (int indexes : lut[bytes[i]])
appendToResult(indexes + (bytes.length - 1 - i) * 8);
for(int i=0;i
测试代码():
public static List<Integer> getBitsIndices(byte[] input, boolean b)
{
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < input.length; ++i)
{
byte j = input[i];
for (int k = 7, bit = 1 << 7; k >= 0; --k, bit >>>= 1)
{
if ((j & bit) == bit == b)
{
list.add((input.length - i) * 8 - (8 - k));
}
}
}
return list;
}
输出:
[23, 22, 21, 20, 19, 18, 17, 16, 9, 8, 2, 0]
测试代码():
public static List<Integer> getBitsIndices(byte[] input, boolean b)
{
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < input.length; ++i)
{
byte j = input[i];
for (int k = 7, bit = 1 << 7; k >= 0; --k, bit >>>= 1)
{
if ((j & bit) == bit == b)
{
list.add((input.length - i) * 8 - (8 - k));
}
}
}
return list;
}
输出:
[23, 22, 21, 20, 19, 18, 17, 16, 9, 8, 2, 0]
我将(给定整数中的{255,3,5}),并始终使用0x1作为最后一位,然后向右移位。
这两种操作都很快,并且具有本机CPU支持
例如:
pos, index = 0; res[];
00000101 AND 0x1 -> TRUE; res[index++] = pos++;
shift right
00000010 AND 0x1 -> FALSE; pos++;
shift right
。。。等等
今晚我将做一个测试实现。我会(给定整数中的{255,3,5}),并始终使用0x1作为最后一位,然后向右移位。
这两种操作都很快,并且具有本机CPU支持
例如:
pos, index = 0; res[];
00000101 AND 0x1 -> TRUE; res[index++] = pos++;
shift right
00000010 AND 0x1 -> FALSE; pos++;
shift right
。。。等等
今晚我将做一个测试实现。数组可以是任意长度的,还是总是3字节长的?它是任意长度的。最大索引可以由(numOfBytes*8)-1指定。谢谢。这个数组可以是任意长度的,还是总是3字节长的?它是任意长度的。最大索引可以由(numOfBytes*8)-1指定。谢谢。这太棒了@Martijn,你介意给我一个反向操作的代码吗?i、 e.从列表中获取原始字节数组?非常感谢。这太棒了@Martijn,你介意给我代码来反转操作吗?i、 e.从列表中获取原始字节数组?非常感谢。谢谢@aioobe,不幸的是我不知道如何使用查找表。。我将尝试看看它们是如何工作的,如何使用它们,并测试代码的速度。再次感谢!谢谢@aioobe,不幸的是我不知道如何使用查找表。。我将尝试看看它们是如何工作的,如何使用它们,并测试代码的速度。再次感谢!谢谢@pewpew,问题是我的bits水平非常差,我几乎无法理解他们的操作。我将非常感谢完整的代码片段。谢谢谢谢@pewpew,问题是我的bits水平非常差,我几乎无法理解他们的操作。我将非常感谢完整的代码片段。谢谢