191思路
1、左移:表示二进制位向左移动,后面补0。数学意义上是乘2.
右移:表示二进制位向右移动,数学意义上是除2取整。
2、循环对每一位都进行判断,是否为1。判断方式就是,比如判断第i位是否为1,就与2的i次方(也就是i位为1,其他位都为0)做与操作。如果第i位为1,则与结果为1;如果第i位为0,则与结果为0。
代码
public int hammingWeight(int n) {
int res=0;
for(int i=0;i<32;i++){
if((n & (1<<i))!=0){
res++;
}
}
return res;
}
190思路
得到n的二进制位的每一位上的数字。比如得到第i位上的数字,左移到(31-i)位上。
代码
public int reverseBits(int n) {
int res=0;
for(int i=0;i<32;i++){
// res=res+ ((n&(1<<i))<<(31-i));
res=res+((1&(n>>i))<<(31-i));
}
return res;
}
371思路-两数相加
1、异或为两数不考虑进位的情况下的结果
2、位与,为需要进位的位置
3、不考虑进位的结果+进位左移一位=结果
代码
public int getSum(int a, int b) {
while(b!=0){
int carry=(a&b)<<1;//将进位的位置往左移动一位,表示进位
a=a^b;//相同为0.不同为1,表示不考虑进位的结果
b=carry;
}
return a;
}