傳送門code
每一個非負整數 N 都有其二進制表示。例如, 5 能夠被表示爲二進制 "101",11 能夠用二進制 "1011" 表示,依此類推。注意,除 N = 0 外,任何二進制表示中都不含前導零。
二進制的反碼錶示是將每一個 1 改成 0 且每一個 0 變爲 1。例如,二進制數 "101" 的二進制反碼爲 "010"。
給你一個十進制數 N,請你返回其二進制表示的反碼所對應的十進制整數。blog
示例 1:圖片
輸入:5
輸出:2
解釋:5 的二進制表示爲 "101",其二進制反碼爲 "010",也就是十進制中的 2 。leetcode
示例 2:get
輸入:7
輸出:0
解釋:7 的二進制表示爲 "111",其二進制反碼爲 "000",也就是十進制中的 0 。源碼
示例 3:it
輸入:10
輸出:5
解釋:10 的二進制表示爲 "1010",其二進制反碼爲 "0101",也就是十進制中的 5 。模板
提示:class
0 <= N < 10^9 本題與 476:https://leetcode-cn.com/problems/number-complement/ 相同
來源:力扣(LeetCode)二進制
int bitwiseComplement(int N){ }
理解題目以後能夠取巧解法
對於輸入的十進制數進行一個範圍劃分
很簡單可知反碼返回的十進制數和原十進制數相加老是等於2n-1因此咱們就須要對原十進制數進行判斷屬於哪一個區間
while(N>pow(2,i)-1){ i++; }
再返回最後的2n-1-N便可
int bitwiseComplement(int N){ int i=1; while(N>pow(2,i)-1)i++; return pow(2,i)-1-N; }