前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:使两个整数相等的位更改次数
代码与解题思路
先读题:
题目要我们把 n 这个数字转换成 k 这个数字,但是只能是二进制位 1 转换成 0
纯模拟的解法:
func minChanges(n int, k int) (ans int) {
for n > 0 {
// 选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0
if n&1 == 1 {
if k == 0 || k&1 == 0 {
ans++
}
}
// 假如 k > n,或者出现 n 的位是 0 而 k 的位是 1 的情况,返回 -1
if k > n || k > 0 && n&1 == 0 && k&1 == 1 {
return -1
}
n >>= 1
k >>= 1
}
return ans
}
位运算的解法:
n&k != k,假如出现有二进制位 n 是 0,k 是 1 的情况, n&k 就不等于 k,可以用来直接判断是否返回 -1
bits.OnesCount 能找到二进制位是 1 的数量,按位异或,相同为 0,相异为 1
func minChanges(n, k int) int {
if n&k != k {
return -1
}
return bits.OnesCount(uint(n ^ k))
}