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水平非常差,我几乎无法理解他们的操作。我将非常感谢完整的代码片段。谢谢