leetcode 338 位元位計算(位運算)

2021-10-08 09:04:33 字數 1077 閱讀 6899

目錄

題目描述:

lowbit函式介紹&題目解析:

c++完整**:

題目**       力扣(leetcode):

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2

輸出: [0,1,1]

示例 2:

輸入: 5

輸出: [0,1,1,2,1,2]

(一). 定義函式lowbit(int x)  

(二).lowbit(x)函式獲取非負整數x在二進位制表示下「最低位的1及其後面所有0」構成的數值:

(1)如十進位制數20的8位二進位制表示為(0001 0100),因為其「最低位的1及其後面所有0」對應二進位制為(0000 0100),所以lowbit(20)的數值就是4。

(2)更一般的理解:x&(-x)就是把正整數x與其負數-x,在二進位制補碼表示下按位做與運算。(-x)的補碼由x按位取反再加1得到,假如將x只取反而不加1得到乙個數y。那位運算x&y必然等於0,因為x和y的二進位制數對應位取反之後不可能同時為1。若x二進位制的最低位是從右往左第i個數,那麼0~i-1之間的數就全是0。取反後得到的y的0~i-1之間的數就全是1,而第i個為0。根據二進位制的加法可以知道,(y+1)的第0~i-1之間的數就全為0了,進製導致第i個數為1,同時進製不影響i+1及其後面的數。故x&(y+1)得到的二進位制數只有第i個數是1,其它全為0。所以就不難理解(二)的描述了。

(3)總結規律:lowbit(x)等同於「能整除x的最大的2的冪次」。由(2)的描述可知lowbit(x)=x&(~x+1)=x&(-x)。

(三)如何獲取乙個數a的二進位制表示下1的個數:在a中減去最低位對應的數a&(-a)獲得乙個新數,再對新數執行同樣操作直到a為0。統計操作的次數即可得到1的個數。

class solution 

vectorcountbits(int num)

ans.push_back(cnt);

}return ans;

}};

leetcode 338 位元數計位

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 高階 思路 對於任意乙個十進位制數來說,有兩種情況。1 奇數,當乙個數為奇數的時候,它對...

leetcode338 位元位計數

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 高階 思路 首先是乙個數減1,對應二進位制的變化就是最右的乙個1變為0,而這個1右邊的所...

Leetcode 338 位元位計數

給定乙個非負整數num。對於0 i num範圍中的每個數字i,計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2輸出 0,1,1 示例 2 輸入 5輸出 0,1,1,2,1,2 高階 要求演算法的空間複雜度為o n 你能進一步完善解法嗎?要求在c 或任何其他語言中不使用任何內建...