476 數字的補數

2021-09-13 11:08:40 字數 1210 閱讀 1549

leetcode上一道關於位運算的題目數字的補數,原題目如下:

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

注意:

給定的整數保證在32位帶符號整數的範圍內。

你可以假定二進位制數不包含前導零位。

示例 1:

輸入: 5

輸出: 2

解釋: 5的二進位制表示為101(沒有前導零位),其補數為010。所以你需要輸出2。

示例 2:

輸入: 1

輸出: 0

解釋: 1的二進位制表示為1(沒有前導零位),其補數為0。所以你需要輸出0。

這道題目我解題的思路是先嘗試對某個數字取反,然後通過位運算把前導零位取反後的1變回0,以入參為5舉例:

對5(二進位制表示為101)取反,獲得11111111111111111111111111111010

要使11111111111111111111111111111010變成101,只需要讓

11111111111111111111111111111010

& 00000000000000000000000000000111

------------------------------------

00000000000000000000000000000101

&為與運算,那麼此時的問題就是如何生成前32-3=29(前導零位的位數,注意int應該是31位的,但是這個還把符號位也算上了)個的0和3個1組成的二進位制數字了

00000000000000000000000000000111可以通過以下方式獲得~((~0)<<3),簡單來說就是

對0取反獲得全為1的二進位制制數,即11111111111111111111111111111111再左移3位(入參的有效位數),得到11111111111111111111111111111000最後取反,得到00000000000000000000000000000111

其實就是使用逆推法來解題。

/**

* 數字的補數

* @param num

* @return

*/public int findcomplement(int num)

476數字的補數

題目點我 給定乙個正整數,輸出它的補數。補數是對該數的二進位制表示取反。注意 給定的整數保證在32位帶符號整數的範圍內。你可以假定二進位制數不包含前導零位。示例 1 輸入 5 輸出 2 解釋 5的二進位制表示為101 沒有前導零位 其補數為010。所以你需要輸出2。示例 2 輸入 1 輸出 0 解釋...

476 數字的補數

題目 給定乙個正整數,輸出它的補數。補數是對該數的二進位制表示取反。注意 給定的整數保證在32位帶符號整數的範圍內。你可以假定二進位制數不包含前導零位 示例 1 輸入 5輸出 2解釋 5的二進位制表示為101 沒有前導零位 其補數為010。所以你需要輸出2。示例 2 輸入 1輸出 0解釋 1的二進位...

476 數字的補數

給定乙個正整數,輸出它的補數。補數是對該數的二進位制表示取反。注意 給定的整數保證在32位帶符號整數的範圍內。你可以假定二進位制數不包含前導零位。示例 1 輸入 5 輸出 2 解釋 5的二進位制表示為101 沒有前導零位 其補數為010。所以你需要輸出2。示例 2 輸入 1 輸出 0 解釋 1的二進...