题干:
给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
示例:
按位与(bitwish AND)的特点
对所有数字执行按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位。
问题转换为:
给定两个整数,我们要找到它们对应的二进制字符串的公共前缀
移位法
func rangeBitwiseAnd(m int, n int) int {
shift := 0
for m < n {
m, n = m >> 1, n >> 1
shift++
}
return m << shift
}
Brian Kernighan 算法
该算法用于清除二进制串中最右边的 1
n &=(n-1)
func rangeBitwiseAnd(m int, n int) int {
for m < n {
n &= (n - 1)
}
return n
}