原题:力扣191.
挨个判断是不是 1 的话需要对整个长度进行遍历,但是采用技巧可以只寻找为 1 的位,然后将其数量记录下来。
public int hammingWeight(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
原题:力扣338.
public int[] countBits(int num) {
int[] bits = new int[num + 1];
for (int i = 0; i <= num; i++) {
bits[i] = countOnes(i);
}
return bits;
}
public int countOnes(int x) {
int ones = 0;
while (x > 0) {
x &= (x - 1);
ones++;
}
return ones;
}
原题:力扣190.
public int reverseBits(int n) {
int reversed = 0, power = 31;
while (n != 0) {
reversed += (n & 1) << power;
n >>>= 1;
power--;
}
return reversed;
}
在 JDK,Dubbo等源码中常见。
reverseBits(int n) {
n = (n >>> 16) | (n << 16);
n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);
n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4);
n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2);
n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1);
return n;
}
原题:力扣371.
public int getSum(int a, int b) {
while (b != 0) {
int sign = (a & b) << 1;
a = a ^ b;
b = sign;
}
return a;
}
原题:力扣面试08.05.
要求写一个递归函数,不能使用 * 运算符,实现两个正整数的相乘。
public int multiply(int A, int B) {
int min = Math.min(A, B);
int max = Math.max(A, B);
int ans = 0;
for (int i = 0; min != 0; i++) {
if ((min & 1) == 1) {
ans += max;
}
min >>= 1;
max += max;
}
return ans;
}
【持续更新】
如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ❤
算法通关村专栏:不易|算法通关村 ❤