题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
输入:10
输出:2
解法1:异或
N与(N取反+1),即N&(~N+1),可以提取出int整型数中最右边的1。先找到最右侧1的位置,再与该数异或,则消掉了右侧第一个1,不断循环,知道没有1。
举例:
整型数n的二进制011011010000,n&(~n+1)后的到000000010000,n在和这个数异或(相同得0相异为1),这时与0异或的位置都不变,异或后的数消掉了原数的最后一个1。
public class Solution {
public int NumberOf1(int n) {
int count = 0;
//011011010000
//000000010000 rightOne
//011011000000 循环1次后