Java中的高效位操作?

时间:2016-07-07 08:20:58

标签: java c++ bit-manipulation time-complexity bits

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

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

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

那么我们是否应该选择C ++来解决这些问题呢?我们是否应该考虑使用Java解决位操作类型问题?如果没有,那么有没有超快的高效技巧而不是应用我们自己的逻辑?

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

1 个答案:

答案 0 :(得分:3)

Long也有bitCount,而lowOneBit,numberOfLeadingZeroes,numberOfTrailingZeroes等。

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

由于Just-In-Time编译器没有启动,这些操作在小型短期运行程序中非常慢。

Java不是C,但是为了那些操作而将java程序内部还原为C / C ++,由于JNI开销通常不值得。

直到现在我发现java足以达到类似的性能,即使人们不会期待它。在分配中,java有时可以击败C / C ++。但是没有人在计算级别上击败C,例如n % 12是如何计算的。