剑指Offer-----------二进制中1的个数

it2022-05-05  130

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

n&(n-1)可以处理最右边的1

如n = 01000100,n-1 = 01000011,n & (n - 1) = 01000000 这样就把最右边的1处理掉了。

每次循环只与1有关,不用将每位都循环到。

public int numberof1(int n) { int sum = 0; while(n != 0){ n = n & (n - 1); sum++; } return sum; }

n & (~n + 1)可以得到最右侧的1

如n = 01000100,n & (~n + 1) = 00000100 用n - (n & (~n + 1))就可以把最右边的1处理掉了 

public int numberof2(int n) { int sum = 0; while(n != 0){ n =n - (n & (~n + 1)); sum++; } return sum; }

 


最新回复(0)