
這道題的前置知識:
- 十進制如何轉成二進制
- 無符号數與有符号數
- 左移右移對原數的影響
問題1:商重複除2取模,模數最後倒置
問題3:一般都是左右移位補0,但是負數不一樣,右移補1 因為第一位是符号位
具體思路:将10進制數與1進行&運算,如果10進制數最右邊的二進制為1結果為1,為0結果為0
然後繼續進行一個右移操作,前邊補0【這種情況未考慮負數】【不右移用除法也可以但是與運算更快】
既然右移不行那就,1進行左移,後邊補0,再做與運算,左移之後的1就能判斷原數相應的2進制位是0還是1
代碼實作:
public class Solution {
public int NumberOf1(int n) {
int num=0;
int value=1;
while(value!=0)
{
if((value&n)!=0)
num++;
value <<= 1;
System.out.print(value&n);
}
return num;
}
}
時間O(32) 空間O(1)
更加巧妙的方法,原數-1 然後兩數作與運算結果為x,直到x為0
時間 O(X) x為二進制中一的個數
public class Solution {
public int NumberOf1(int n) {
int num=0;
while(n!=0)
{
n=n&(n-1);
num++;
}
return num;
}
}
總結自己看:導緻自己在這道題花費較多的時間就是
if((value&n)!=0) 與運算之後不是==1
題意要逐字看,是哪個數在左移
短短幾行代碼看了一個多小時