题目描述
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
解法
- 位移
思路:暴力法肯定不用考虑了,数字很大时一定会超时🤒。最开始的思路是将范围内的数字一位一位的做与运算,最后一想和暴力法区别不大。看了官方题解,学到了位移法。
可以发现,由于与运算的特性是有0则0,所以m, n范围内的数字相与就是这两个数字的最长公共前缀,然后在后面补上相应的0即可。
8 12范围内按位与的结果为8
4 12范围内按位与的结果为0
步骤是这样的,判断m和n是否相等,如果不相等,m n均向右移一位,直到m n相等为止。记录下移动的位数,最终返回m左移移动的位数。
1 | class Solution { |