Java 中的高效位操作
Efficient bit manipulation in Java?
我是一名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
。
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 在数组大小中使用位操作的原因
- Java 中的高效位操作