Java 中的高效位操作

Efficient bit manipulation in Java?

本文关键字:位操作 高效 Java      更新时间:2023-10-16

我是一名Java程序员,最近开始竞争编码(Codechef,Hackerearth等)

我有一种感觉,当涉及到非常大的输入值时,在 Java 中,位操作真的非常慢。根据我的经验,相同的C/C++代码(我的意思是如果使用相同的算法,相同的策略等从java转换。从 Java 转换为 C/C++ 时,我没有改变我的逻辑,反之亦然)成功运行所有测试用例,生成超过 Java 中的时间限制。我知道大多数竞争性编程网站为 Java 程序提供 2 倍的执行时间,但它仍然超过了时间限制。

在像C++这样的语言中,我们有像__builtin_popcount这样的函数,它可以利用非常快的CPU内置函数。这样的东西在Java中不可用。像java.lang.Integer.bitCount()这样的某些函数仅适用于 32位int

那么,对于此类问题,我们是否应该更喜欢C++呢?我们甚至应该考虑使用Java解决位操作类型的问题吗?如果没有,那么除了应用我们自己的逻辑之外,是否有任何超快速高效的技巧?

(还有一个事实是,不同的架构机器需要不同的时间,但让我们忽略这一点。我的问题是在竞争性编程的背景下)

Long也有bitCount,以及lowestOneBit,numberOfLeadingZeroes,numberOfTrailingZeroes等。

然后是BitSet,更多用于布尔目的。

这些操作在小型短运行程序中非常慢,因为即时编译器不会启动。

Java

不是C,但是在Java程序中恢复到C/C++进行此类操作,由于JNI开销,通常不值得。

到目前为止,我发现Java足以达到类似的性能,即使人们不会期望它。在分配中,java有时可以击败C/C++。但是没有人在计算器水平上击败C,例如如何计算n % 12