LeetCode每日一題: 十進制整數的反碼(No.189)

題目: 十進制整數的反碼


每一個非負整數 N 都有其二進制表示。
例如, 5 能夠被表示爲二進制 "101",11 能夠用二進制 "1011" 表示,依此類推。
注意,除 N = 0 外,任何二進制表示中都不含前導零。
二進制的反碼錶示是將每一個 1 改成 0 且每一個 0 變爲 1。例如,二進制數 "101" 的二進制反碼爲 "010"。
給定十進制數 N,返回其二進制表示的反碼所對應的十進制整數。
複製代碼

示例:


輸入:5
輸出:2
解釋:5 的二進制表示爲 "101",其二進制反碼爲 "010",也就是十進制中的 2 。

輸入:7
輸出:0
解釋:7 的二進制表示爲 "111",其二進制反碼爲 "000",也就是十進制中的 0 。

輸入:10
輸出:5
解釋:10 的二進制表示爲 "1010",其二進制反碼爲 "0101",也就是十進制中的 5 。
複製代碼

思考:


這道題將原數二進制表示中的1變爲0變爲1便可,能夠使用異或位運算來完成。
異或運算相同爲0,不一樣爲1。
例如:10101^11111 = 01010 
因此這題能夠將N與比他大的二進制全部位都爲1的數進行異或運算,即爲結果。
因此先求這個比N大且全部位都爲1的數。
經過<<左移運算符來計算,<<1等於乘以2,二進制中等於在原數後加一個0。
1 << 1 = 10 + 1 = 11
11 << 1 = 110 +1 = 111
......
求的大於N且每位都爲1的數,與N異或便可。
複製代碼

實現:


class Solution {
public int bitwiseComplement(int N) {
    int num = 1;
    while(num < N){
        num = (num << 1) + 1;
    }
    return N ^ num;
}
}複製代碼
相關文章
相關標籤/搜索