有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用逐位操作实现二维数组的java

A) int a[][]=new int[20][32];
   a[2][3]=1;
   if(a[2][3]==1)
   {
    System.out.println("true");
   }
B) int a[]=new int[20];
   a[2]=12;
   if ((a[2] & (1 << 3)) != 0)
   {
    System.out.println("true");
   }

在A)我使用2D int数组时,我检查[2,3]是否为1
在B)中,我使用Int的索引作为第二个dim。一块垫子。这里我检查数组第二个元素的3位。 哪一个更好?为什么在速度和记忆方面


共 (2) 个答案

  1. # 1 楼答案

    我要打破自己的规则,给出一个基于意见的“答案”

    很明显,您的第一个方法更具可读性,但它将占用更多内存。如果您在一个非常大的数组上执行此操作,并且在内存中受到限制,那么按位掩码是有意义的

    我强烈建议您远离像这样的“聪明”技术,除非它们被很好地封装在更高级别的函数中——在这一点上,对于这样一个简单的例子,您将失去性能优势(如果有的话),但会提高内存效率

    当然,当第二维度不是32时,效率增益将更小(并且可能需要进一步解决特定比特数飞涨的问题)

  2. # 2 楼答案

    对于小尺寸,测试位可能比测试普通整数花费更多的时间。然而,对于更大的维度,这将是值得的——第二个示例使用的内存大约是原来的32倍(忽略了拥有数组对象的开销),这意味着更多的内存将留在缓存中,这比主内存快得多(与CPU相比非常慢)。在今天的机器上,通常情况下,使用更多的指令以便更好地使用缓存会使事情变得更快,然而,当整个事情一开始就很小时,测试位的开销可能不值得

    还有另一种情况,使用第二个示例中的“微位数组”可以很好地解决问题:当您可以利用它们是int的事实,而不仅仅是单独访问位时。例如,如果您打算在当时对整个32位块执行布尔运算,或者如果您想计算1的数量,或者如果您想获得具有1的最低索引(特别是如果您确实想要掩码而不是索引)