https://leetcode-cn.com/problems/number-complement/
简单题 引发了一些思考
做法1:从最高位开始找最高位的1 之后找到之后的所有0 进行运算即可
#include<bits/stdc++.h> class Solution { public: int findComplement(int num) { int f=-1; for(int i=31;i>=0;i--){ if((num>>i&1)==1){ f=i; break; } } int ans=0; for (int i = 0; i < f; i++) { if(((num>>i)&1)==0) { ans|=(1<<i);} } return ans; } };
做法2:利用lowbit找到最高位的1 比如0010 0000 这个数减1 0001 1111 直接与取反后的num&即可
#include<bits/stdc++.h> class Solution { public: int findComplement(int num) { int ans=0; for (int i = num; i !=0; i-=(i&-i)) { ans=i; } return ~num&(ans-1); } };
关于引发的思考:补码这一原因 为何~5=-6 看计算机内部的时候一定要以补码的形式去理解 5=0101(前面一堆0) 取反 1010(前面一堆1) 这个时候这个数成了负数
负数的补码是取反后加1
所以 1010这个数对应的10进制数是-1后取反 1001取反 0110(前面一堆0) 即 -6
Comments | NOTHING