Java 中位运算符有与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)、无符号右移(>>>),只针对 int 类型有效,也可以作用于 byte、short、char、long,当为这四种类型时,JVM 会先把它们转换为 int 再操作。使用位运算符可以优化一些场景的运行速度,有时也可以简化代码,掌握一些位操作的技巧还是很有必要的,下面是我总结的 LeetCode 上一些位操作算法问题。
1. 在 O(n)时间内求 0 ~ N 的所有整数的二进制表示中 1 的个数
题目描述:给定一个非负整数 num,求 0 到 num 所有数的二进制表示中 1 的个数,最好在一次遍历 O(n)时间内完成,而且不能使用内置 API。
分析:求二进制表示中 1 的个数可以使用 Integer.bitcount() 实现,但是题目要求不能使用其他内置函数,所以好像没什么办法可以 O(1) 时间内求一个数的 bitcount。这种情况下,可以看下实际的例子。
0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
0 | 1 | 10 | 11 | 100 | 101 | 110 |
0 | 1 | 1 | 2 | 1 | 2 | 2 |