【2021.3.22 每日一题】LC 191
- java中数据都是有符号数;
- 补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1); - 使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
原码补码: 引用链接.
//1ms(95.2%) 35.2MB(80.86%)
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count=0;
if(n<0){
n=n & 0x7fffffff;
//int类型4个字节,4*8/4=8,16进制需要用0x7fffffff去抹平符号位
count++;
}
for (int i=1;i<32;i++){
if(n%2==1)count++;
n=n/2;
}
return count;
}
}
//tips 1 ms(95.6%) 35.4 MB(56.81%)
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count=0;
if(n<0){
n=n & 0x7fffffff;
count++;
}
while(n!=0){
count+=n&1;
n>>=1;
}
return count;
}
}
// LC 1 ms(95.6%) 35.3 MB(66.91%)
public class Solution {
public int hammingWeight(int n) {
int ret = 0;
while (n != 0) {
n &= n - 1;
ret++;
}
return ret;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode-solution-jnwf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
位运算优化 思路及解法
观察这个运算:n&(n - 1)n & (n−1),其预算结果恰为把 nn 的二进制位中的最低位的 11 变为 00 之后的结果。
复杂度分析
时间复杂度:O(log n); 循环次数等于 nn 的二进制位中 1 的个数
空间复杂度:O(1)