和1做与运算,结果为1的那一位就是1,不断右移
第一个版本
public static int hammingWeight(int n) { int count = 0; while(n!=0){ if((n&1)==1) count++; n=n>>1; } return count; }
超时了?
自己输几个用例
我不懂!题目函数的参数是int,为什么会有这种用例,这不是题目的错误吗。在编辑器里面根本都过不了
我把里面的n转化成long也不行
我把函数参数改成long也不行???
为什么还会显示Integer?
明明这个时候还是long
我懂了,应该是java默认输入的参数都是int类型的
服了,这是什么BUG题目,真强
假如题目是long,那么只要移位即可。使用int毫无意思,java里面没有unsigned int。
后来想到int的最大值是2147483647,那么2147483649是2147483647+1,用int肯定传不进来的,但是题目模范就是int。
没法
2147483647是整数里面最大的,就是0 1111111111111111111111111111111111111111111111111111111111(乱打的1,没数多少)
那么2147483648就是 0 11111111111111111111111111111 + 1 = 1 000000000000000000000000
因为最前面的1位是1,所以右移的话,左边是补1的,不会等0,所以导致了前面的超时!
太恶心了。
这个时候,1 000000000000000000000 是 -0 就是 0
这个不是补码,而是乱来
1 00000000000000000000001 呢 2147483649 要怎么算呢?
或许能用2147483649 - 2147483647 - 1 ?
无论怎么算,都没法找到好的方法。
但是有一种方法可以完美解决这种问题。
不是用原数据来移位。
就是改变用来与运算的值。1,10,100,1000,10000 .。。。。。。。。。。。 这样就能不断的从右往左去比较了!
一开始是负数的情况使用的,后来发现无论是整数还是负数都管用!
0 11111111111111111111111111111 比如判断第五位 使用 10000 ,只要与运算之后,结果是10000就行了,只关注第五位,其他的不管,就是和
0 0000000000000000000010000 运算
public int hammingWeight(int n) { int i = 0; int test = 1; int count = 0; while(i<32){ if((n&test)==test) count++; test=test<<1; i++; } return count; }
说到底,还是题目的int太恶心了,明明是int是无法通过的,为了不让使用long,就用int来误导别人。