使用逐位操作实现二维数组的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位。
哪一个更好?为什么在速度和记忆方面
# 1 楼答案
我要打破自己的规则,给出一个基于意见的“答案”
很明显,您的第一个方法更具可读性,但它将占用更多内存。如果您在一个非常大的数组上执行此操作,并且在内存中受到限制,那么按位掩码是有意义的
我强烈建议您远离像这样的“聪明”技术,除非它们被很好地封装在更高级别的函数中——在这一点上,对于这样一个简单的例子,您将失去性能优势(如果有的话),但会提高内存效率
当然,当第二维度不是32时,效率增益将更小(并且可能需要进一步解决特定比特数飞涨的问题)
# 2 楼答案
对于小尺寸,测试位可能比测试普通整数花费更多的时间。然而,对于更大的维度,这将是值得的——第二个示例使用的内存大约是原来的32倍(忽略了拥有数组对象的开销),这意味着更多的内存将留在缓存中,这比主内存快得多(与CPU相比非常慢)。在今天的机器上,通常情况下,使用更多的指令以便更好地使用缓存会使事情变得更快,然而,当整个事情一开始就很小时,测试位的开销可能不值得
还有另一种情况,使用第二个示例中的“微位数组”可以很好地解决问题:当您可以利用它们是
int
的事实,而不仅仅是单独访问位时。例如,如果您打算在当时对整个32位块执行布尔运算,或者如果您想计算1的数量,或者如果您想获得具有1的最低索引(特别是如果您确实想要掩码而不是索引)