题目
解法
进制转换
进制转换有一个固定的模板,我是用的比较直观的一种方式
class Solution {
/**
* @param Integer $num
* @return Integer
*/
function findComplement($num) {
$ret = 0;
$mul = 1;
while ($num > 0) {
$mod = $num % 2;
$num = floor($num / 2);
$ret += abs($mod - 1) * $mul;
$mul *= 2;
}
return $ret;
}
}
位运算与进制转换
还有一种方式是进行位移操作, $num >> 1;
判断最小位是否是1可以使用 $num & 1
表示
class Solution {
/**
* @param Integer $num
* @return Integer
*/
function findComplement($num) {
$ret = 0;
$mul = 1;
while ($num > 0) {
if (($num & 1) != 1) {
$ret += $mul;
}
$num >>= 1;
$mul *= 2;
}
return $ret;
}
}
位运算
官方题解的方案是:
- 查到最高的那一位
- 然后算出来 mask
- 将数字与 mask 进行异或
代码就不贴出来了, 可以到官方题解查看