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