此题有多种方法,这里例举两个
①用到(位移操作符)>>操作符,以及(按位与操作符)&操作符
原理:
将将两个数字的二进制同时向右移动(>>),并且利用按位与(&)1(相同得到的结果为1),如果此时的到的结果为1,那么这两个位的数字一定相同,而我们要找的是在二进制中不同位的个数,所以只要让它们的不相等就行,最后拿个变量进行记录.
代码如下:
for循环是32,是只考虑在32位中不同的个数,如果更多位需要改变,比如64位就改成64
另一种方法:
②利用(按位异或操作符)^操作符,以及公式:n=n&(n-1) ---公式不懂的可以看一下求一个十进制数字,在二进制中存在1的个数._srhqwe的博客-CSDN博客的第二解法有写.
原理:
通过按位异或(^)可以让两个十进制数字在二进制中进行比较,相同为0,不同为1,那么就可以得出0和1组合的一串二进制,这个二进制中的0就是说明两个位置上是相同的,二进制中的1就是说明两个位置上是不同的。
再通过n=n&(n-1)可以得到其中1的个数,这里也有其他方法(不懂的也可以看这里)
求一个十进制数字,在二进制中存在1的个数._srhqwe的博客-CSDN博客
代码如下: