112、數字的補數
阿新 • • 發佈:2018-12-23
給定一個正整數,輸出它的補數。補數是對該數的二進位制表示取反。
注意:
給定的整數保證在32位帶符號整數的範圍內。
你可以假定二進位制數不包含前導零位。
示例 1:
輸入: 5
輸出: 2
解釋: 5的二進位制表示為101(沒有前導零位),其補數為010。所以你需要輸出2。
示例 2:
輸入: 1
輸出: 0
解釋: 1的二進位制表示為1(沒有前導零位),其補數為0。所以你需要輸出0。
媽呀,一個這個整了這麼久,很煩
class Solution { public int findComplement(int num) { if(num == 1){ return 0; } if(num == 0) return 1; int tem = num; int result = 0; int result2 = 0; //首先計算有多少位 while (num != 0) { **result = result * 2 + (num & 1 ^ 1);**//這裡一定要加上括號,不然加法會報錯 num = num >> 1; result2 ++; } int result1 = 0; while (result2 > 0) { result1 = result1 * 2 +( result&1); result = result >> 1; result2 --; } return result1; } }
排名靠前的程式碼
class Solution {
public int findComplement(int num) {
int result = ~num;
for (int i = 31; i > 0; i--) {
if (num >> i == 1) {
break;
}
result ^= 1 << i;
}
return result;
}
}
有點複雜
其實這個比較簡單
class Solution {
public int findComplement(int num) {
int point = 1;
while (point < num){
point = (point << 1) + 1;
}
return point - num;
}
}