1. 程式人生 > >112、數字的補數

112、數字的補數

給定一個正整數,輸出它的補數。補數是對該數的二進位制表示取反。

注意:

給定的整數保證在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;
    }
}